这是我的ListView模型,它更多与我建立的名为Comment的数据库表相对应。
public int EntryId { get; set; }
public DateTime Posted { get; set; }
public string AuthorIp { get; set; }
[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 ListView(IBlogRepository blogRepository)
{
Posts = blogRepository.Posts();
}
public ListView(){ }`
我需要将一些属性放入我的Comment表中。我使用或至少尝试使用IRepository Framework。就像这样......
public interface IBlogRepository : IDisposable
{
IList<Entry> Posts();
void InsertComment(Comment comment);
void Save();
}
这是我的继承课......
public class BlogRepository : IBlogRepository, IDisposable
{
private BlogDataDataContext _dataContext;
public BlogRepository() { _dataContext = new BlogDataDataContext(); }
// #region IBlogRepository Members
public void InsertComment(Comment comment)
{
_dataContext.Comments.InsertOnSubmit(comment);
}
public void Save()
{
_dataContext.SubmitChanges();
}
所以我从我的BlogController上面调用了上面的InsertComment。
[HttpPost]
public ActionResult BlogPost(ListView pModel)
{
pModel.Posted = DateTime.Now;
_repository.InsertComment( // Cannot pass pModel as is not Comment type.
return RedirectToAction("BlogPost");
}
所以我的问题是我的ListView pModel是传入但它不是Comment类型所以我不能正确插入它。我需要我的ListView模型,因为它包含额外的验证规则和几个构造函数。任何人都知道我哪里出错了。
我是否需要创建一个直接镜像我正在考虑的数据库表的模型。那么我在哪里移动我的构造函数和其他验证规则?感觉我需要两个型号。一个在另一个之上。我现在非常接近理解这一点。
提前致谢。
答案 0 :(得分:0)
我认为您的方法整体看起来不错,但您需要某种方式来获取当前Comment
对象以传递到您的存储库。无论是创建另一个对象来容纳两个对象,还是重构代码,我都建议您查看以下文章:
答案 1 :(得分:0)
如果您使用ASP.NET MVC,您的模型应该是表格的精确“副本”。 如果您希望其他一些信息传递到您的视图,您可以使用viewmodels。
在你的例子中,你为什么不这样做:
[HttpPost]
public ActionResult BlogPost(ListView pModel)
{
pModel.Posted = DateTime.Now;
foreach (Comment comment in ListView.Posts)
{
_repository.InsertComment(comment);
}
return RedirectToAction("BlogPost");
}
答案 2 :(得分:0)
您可以使用AutoMapper将ViewModel中的属性映射到控制器中的评论业务模型:
var comment = Mapper.Map<ListView, Comment>(pModel);
_repository.InsertComment(comment);
使用ViewModels或DTO时,这是常见的做法。