ASP.Net MVC 2可以在HttpGet方法中获得相同的模型实例(略有变化),这在HttpGet中传递

时间:2010-05-05 14:30:18

标签: nhibernate asp.net-mvc-2 model-binding

我有一个复杂的实体用户:

    public class User : BaseEntity
    {        
    public virtual Taxi Taxi { get; set; }  --> That is why i call it "complex"
    public virtual string Login { get; set; }           
    public virtual string Password { get; set; }  
    }

其中Taxi是User的父级(Taxi has-many Users):

    public class Taxi : BaseEntity
    {
      public virtual string Name { get;  set; }
      public virtual string ClientIp { get;  set; }
    }

BaseEntity由public virtual int Id {get;私人集; }

尝试编辑用户时出现问题

    [Authorize]  
    public ActionResult ChangeAccountInfo()
    {
        var user = UserRepository.GetUser(User.Identity.Name);
        return View(user); 
    }

我的ChangeAccountInfo.aspx

        <fieldset>
        <legend>Fields</legend>
        <%  %>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Login) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Login) %>
            <%: Html.ValidationMessageFor(model => model.Login) %>      
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Password) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Password) %>
            <%: Html.ValidationMessageFor(model => model.Password) %>
        </div>  

         <div class="editor-field">
            <%: Html.HiddenFor(model => model.Taxi.Name)%>               
        </div>     

        <p>
            <input type="submit" value="Save" />
        </p>
       </fieldset>

发布更改:

    [Authorize]
    [HttpPost]
    public ActionResult ChangeAccountInfo(User model)
    {
        if (ModelState.IsValid)
        {
            UserRepository.UpdateUser(model); 

            return RedirectToAction("ChangeAccountInfoSuccess", "Account");
        }

        return View(model);
    }

但是,(用户模型)参数有      User.Id == 0 - &gt;用户实体在编辑之前有5个      User.Login ==“我的新登录”
     User.Password ==“我的新密码”
     User.Taxi.Id == 0 - &gt; User.Taxi实体在编辑之前有3个      User.Taxi.Name ==“旧隐藏名称”
     User.Taxi.ClientIp == null - &gt;用户实体在编辑之前有192.168.0.1

问: 是否有可能不标记实体的所有字段(应该在我的UpdateUser中),标记为“hidden”但仍然在我的HttpPost方法中保持不变? 例如不是User.Taxi.ClientIp = null,但是User.Taxi.ClientIp = 192.168.0.1

我正在使用nhibernate,如果重要的话。

2 个答案:

答案 0 :(得分:1)

并非没有一些繁重的举动。我不确定nhibernate是否关心它是否是同一个实例;您可能只需要保留表单的实体ID即可。

如果第二种情况属实,您需要做的就是在表单中创建一个隐藏字段来存储模型的ID。 MVC将完成剩下的工作。只需将你的表格放在顶部:

<%= Html.HiddenFor(model => model.Id) %>

如果您关注人们的黑客攻击(并且您应该这样做),您可以指定(通过白名单或黑名单)在表单中可以/不可以编辑哪些属性。

答案 1 :(得分:0)

威尔建议的答案是最符合我的问题:
编辑您的实体
- 为您的视图提供您要编辑的实体标识
- 在隐藏字段中发布带有标识的模型(在我的情况下,我不能使用model.Id私有设置器,因为nhib映射设置)
- 在httpPost方法中使用GetById(idFromHiddenField)来检索你的entityFromDatabase
- 使用UpdateModel(entityFromDatabase) - 将合并旧版本(entityFromDatabase)和新版本的实体
- 然后ISession.Update(entityFromDatabase)将更改保留到数据库