代码之家  ›  专栏  ›  技术社区  ›  nfplee

ASP.NET MVC-NHibernate-下拉列表

  •  0
  • nfplee  · 技术社区  · 14 年前

    我刚开始使用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);,插入成功完成,但在显示用户时没有填充数据。

    我的首选解决方案是从用户实体中删除roleid属性(如nhibernate建议的那样),但是我必须自己处理验证逻辑。

    如果有人能帮忙,我会很感激的。谢谢

    1 回复  |  直到 14 年前
        1
  •  0
  •   nfplee    14 年前

    我发现最好的方法是说:

    [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);
    
        ...
    }
    

    目前,我对我的黑客解决方案比较满意,但是如果有人知道我如何摆脱用户。role=new role();在编辑操作中,如果他们能分享,我会感激的。谢谢

    btw如果您在验证失败时向视图返回多个数据,并且需要执行get(例如检索角色)。然后您需要回滚在nhibernate事务中所做的更改,以防止出现其他问题。希望这能节省一些时间:)。