我的User对象有一个Edit操作/视图,但只想要一些字段可编辑。
我已将视图设置为绑定到User对象,并且正在使用Html.EditorFor()来处理我想要编辑的几个字段。
我注意到Post上的User对象:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditUser(Mynamespace.User user)
{ }
只有我提供的字段.EditorFor()控件实际上才有任何数据 我尝试将Html.Hidden(Model.ID)用于我不想编辑的其中一个字段,但在从模型绑定创建的新User对象中它为null。
所以,我的问题 - 如何绑定只有几个字段应该可编辑的地方?
谢谢!
答案 0 :(得分:1)
您是否正在使用强类型助手来隐藏字段,或者它与您键入的内容完全相同。如果您完全按类型输入,则隐藏字段的名称是id的值,而不是模型上属性的名称(ID
)。您可能希望将其更改为:
<%= Html.Hidden( "ID" ) %>
或(如果使用强类型助手)
<%= Html.HiddenFor( m => m.ID ) %>
答案 1 :(得分:1)
听起来您可能想要开始考虑使用特定于您正在处理的表单/输入的视图模型。但在短期内,......
您可以绑定到FormCollection
参数,然后手动复制值,或者......
您可以使用TryUpdateModel
方法使用新数据填充此现有用户对象。
以下是TryUpdateModel
的文档:
http://msdn.microsoft.com/en-us/library/dd470756.aspx
恶意用户仍然可以发送映射到模型上的真实属性的虚假表单值,因此为了防止这种情况(如员工通过简单的表单黑客更改其工资属性),您可以引入包含的界面您允许的白名单属性。
以下是一个例子:
public interface IUserEditableFields
{
string Username {get;set;}
string Email {get;set;}
}
//... in the controller action
if(TryUpdateModel<IUserEditableFields>(user)) {
//validation passed
//only Username and Email were editable
}
这是一个很好的资源,如何做到这一点: http://css.dzone.com/news/aspnet-mvc-think-before-you-bi
答案 2 :(得分:1)
Ben的答案基本上是正确的,因为ViewModel可能更合适,而且可以使用TryUpdateModel
。但是,我补充说,在这种情况下,不要求域对象实现新接口,而是使用重载TryUpdateModel<T>(T, string[])
,它允许您按名称将字符串数组中的可更新属性列入白名单。