[英]MVC Repository pattern and adding records to a database
我試圖為正在慢慢開發的Blog功能插入評論記錄,以便掌握.NET中的MVC框架。 我得到的存儲庫模式不是.NET。 一切順利。 我在整理所有內容時遇到了一些困難,以便可以將注釋成功插入數據庫中。
這是繼承的類,它也使用IDisposable。 真的不知道為什么。 可能是垃圾回收,也可能是多重繼承。
public class BlogRepository : IBlogRepository, IDisposable
{
private BlogDataDataContext _dataContext;
public BlogRepository() { _dataContext = new BlogDataDataContext(); }
// #region IBlogRepository Members
public IList<Entry> Posts()
{
var entries = from m in _dataContext.Entries select m;
return entries.ToList();
}
public void InsertComment(Comment comment)
{
_dataContext.Comments.InsertOnSubmit(comment);
}
public void Save()
{
_dataContext.SubmitChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_dataContext.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// #endregion
}
我相信以上都可以實現。 我的問題是下一個問題。 這是使用不同的任務使用GET和POST重載BlogPost的控制器。 我對第二種方法感興趣。
public ActionResult BlogPost(int id, string title){
var viewModel = new ListViewModel(_repository);
ViewData["id"] = id;
return View("BlogPost", viewModel);
}
[HttpPost]
public ActionResult BlogPost(int id, string username, string email, string message)
{
if (ModelState.IsValid) {
// help....
return RedirectToAction("BlogPost");
}
return View();
}
這是我使用的綁定到視圖的模型。
public class ListViewModel
{
[Required(ErrorMessage = " A Name is required *")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[StringLength(160, MinimumLength = 2, ErrorMessage = "Must be between 2 & 160 characters in length.")]
public string AuthorName { get; set; }
[Required(ErrorMessage = "Email address required *")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[StringLength(160, MinimumLength = 2, ErrorMessage = "Must be between 2 & 160 characters in length *")]
[EmailValidation(ErrorMessage = "Must be valid email *")]
public string AuthorEmail { get; set; }
[Required(ErrorMessage = " A Message is required *")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[StringLength(4000, MinimumLength = 2, ErrorMessage = "Must be between 2 & 4000 characters in length *")]
public string Body { get; set; }
public ListViewModel(IBlogRepository blogRepository)
{
Posts = blogRepository.Posts();
}
public IList<Entry> Posts { get; private set; }
public IList<Comment> Comment { get; private set; }
}
我不知道如何將BlogPost POST方法連接到上面的ListViewModel,該方法具有一些驗證規則,這樣我就可以成功地將數據插入數據庫並保持存儲庫模式的完整性。 我遇到困難,因為我只能使用一個模型。 如果有人可以讓我對我要去哪兒做錯有任何見解,我將非常感激。 我知道我已經接近了,一旦實現,我就可以將這種方法應用於以后的所有工作。
更改您的操作以接受模型作為參數,例如
[HttpPost]
public ActionResult BlogPost(ListViewModel model)
{
}
更新:
從ListViewModel中刪除構造函數,現在看起來像
public class ListViewModel
{
[Required(ErrorMessage = " A Name is required *")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[StringLength(160, MinimumLength = 2, ErrorMessage = "Must be between 2 & 160 characters in length.")]
public string AuthorName { get; set; }
[Required(ErrorMessage = "Email address required *")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[StringLength(160, MinimumLength = 2, ErrorMessage = "Must be between 2 & 160 characters in length *")]
[EmailValidation(ErrorMessage = "Must be valid email *")]
public string AuthorEmail { get; set; }
[Required(ErrorMessage = " A Message is required *")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
[StringLength(4000, MinimumLength = 2, ErrorMessage = "Must be between 2 & 4000 characters in length *")]
public string Body { get; set; }
public IList<Entry> Posts { get; private set; }
public IList<Comment> Comment { get; private set; }
}
然后在您的控制器中添加存儲庫,例如
[HttpPost]
public ActionResult BlogPost(int id, string username, string email, string message)
{
var repo = new BlogRepository();
if (ModelState.IsValid) {
// help....
return RedirectToAction("BlogPost");
}
return View();
}
我認為您對存儲庫模式的實現有些錯誤,請看一下本教程: http : //www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing ASP.NET MVC應用程序中的存儲庫和工作單元模式
然后,對於您的問題,我認為您的博客和評論模型應如下所示:
public class BlogPost
{
// properties such as id, title, body, etc. Don't forget to add validation attributes.
public virtual IList<Comment> Comments {get;set;}
}
public class Comment
{
// again properties such as id, author, e-mail, etc. and validation
// the FK to BlogPost
public int BlogPostId {get;set;}
public virtual BlogPost BlogPost {get;set;}
}
對於這兩個實體,您都應按照該教程中的說明創建一個存儲庫。 在MVC中:
public ActionResult AddComment(int blogPostId)
{
return View(new Comment { BlogPostId = blogPostId} ); // maybe some validating on the blogPostId
}
[HttpPost]
public ACtionResult AddComment(Comment model)
{
// do some manual validating yourself first, e.g. check if the model.BlogPostId still exists. One could have changed this to test your security...
if (ModelState.IsValid)
{
// save the new comment here, for examle:
var commentRepo = new CommentRepository();
commentRepo.Insert(model);
commentRepo.Save();
return Redirect.... // redirect to for example the post page
}
return View(model);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.