我刚刚开始使用ASP.NET MVC,我正在使用NHibernate来处理我的数据上下文。我将外键字段保存在我的实体类中,以便它可以更容易地使用下拉列表,但事实并非如此。
这是我的回复动作:
var user = userRepository.GetById(id);
if (!TryUpdateModel(user, "User", new[] { "UserName", "RoleID" }))
return View(user);
// Update the role
user.Role = roleRepository.GetById(user.RoleID);
这允许我将验证逻辑放在User.RoleID属性上。
一切正常,直到它保存。这是我的用户和映射类:
public virtual int UserID { get; set; }
[Required(ErrorMessage = "Username is required")]
public virtual string UserName { get; set; }
[Required(ErrorMessage = "Role is required")]
public virtual int RoleID { get; set; }
public virtual Role Role { get; set; }
public UserMap()
{
Table("Users");
Id(x => x.UserID);
Map(x => x.UserName);
Map(x => x.RoleID);
References(x => x.Role, "RoleID");
}
但是,当它尝试提交更改时会抛出错误。我尝试删除Map(x => x.RoleID);从上面的映射中,插入成功完成,但是在显示用户时没有填充数据。
我首选的解决方案是从User实体中删除RoleID属性(按照NHibernate的建议)但是我必须自己处理验证逻辑。
如果有人可以提供帮助,我会很感激。感谢
答案 0 :(得分:0)
我发现最好的方法就是说:
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Create(FormCollection collection)
{
var user = new User();
if (!TryUpdateModel(user, new[] { "UserName", "Role" }))
return View(user);
...
}
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Edit(int id, FormCollection collection, string returnUrl)
{
var user = userRepository.GetById(id);
user.Role = new Role(); // Needed to prevent another issue when saving
if (!TryUpdateModel(user, new[] { "UserName", "Role" }))
return View(user);
...
}
现在我对我的hacky解决方案比较满意但是如果有人知道我怎么能摆脱user.Role = new Role();在编辑动作中,如果他们可以分享,我会很感激。感谢
btw如果您在验证失败时将多个数据返回到视图,并且您需要进行获取(例如,检索角色)。然后,您需要回滚在nhibernate事务中所做的更改,以防止出现其他问题。希望能节省一些时间:)。