ASP.NET MVC - NHibernate - DropDownLists

时间:2010-08-04 15:50:58

标签: asp.net-mvc nhibernate

我刚刚开始使用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的建议)但是我必须自己处理验证逻辑。

如果有人可以提供帮助,我会很感激。感谢

1 个答案:

答案 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事务中所做的更改,以防止出现其他问题。希望能节省一些时间:)。