我有一个复杂的实体用户:
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,如果重要的话。
答案 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)将更改保留到数据库