mvc模型绑定

时间:2010-01-14 15:46:27

标签: asp.net-mvc

我的User对象有一个Edit操作/视图,但只想要一些字段可编辑。

我已将视图设置为绑定到User对象,并且正在使用Html.EditorFor()来处理我想要编辑的几个字段。

我注意到Post上的User对象:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditUser(Mynamespace.User user)
{ }

只有我提供的字段.EditorFor()控件实际上才有任何数据 我尝试将Html.Hidden(Model.ID)用于我不想编辑的其中一个字段,但在从模型绑定创建的新User对象中它为null。

所以,我的问题 - 如何绑定只有几个字段应该可编辑的地方?

谢谢!

3 个答案:

答案 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[]),它允许您按名称将字符串数组中的可更新属性列入白名单。