簡體   English   中英

MVC存儲庫模式並將記錄添加到數據庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM