我查看了大多数ModelBinding示例,但似乎无法收集我正在寻找的内容。
我想:
<%= Html.TextBox("User.FirstName") %>
<%= Html.TextBox("User.LastName") %>
在帖子上绑定到此方法
public ActionResult Index(UserInputModel input) {}
其中UserInputModel是
public class UserInputModel {
public string FirstName {get; set;}
public string LastName {get; set;}
}
约定是使用类名称为“InputModel”,但我不想每次都使用BindAttribute指定它,即:
public ActionResult Index([Bind(Prefix="User")]UserInputModel input) {}
我已经尝试重写DefaultModelBinder,但似乎无法找到适当的位置来注入这一小部分功能。
答案 0 :(得分:2)
传递给ModelName
函数的ModelBindingContext
对象中的BindModel
属性是您要设置的。这是一个模型绑定器,它执行此操作:
public class PrefixedModelBinder : DefaultModelBinder
{
public string ModelPrefix
{
get;
set;
}
public PrefixedModelBinder(string modelPrefix)
{
ModelPrefix = modelPrefix;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
bindingContext.ModelName = ModelPrefix;
return base.BindModel(controllerContext, bindingContext);
}
}
在Application_Start
中注册,如下所示:
ModelBinders.Binders.Add(typeof(MyType), new PrefixedModelBinder("Content"));
现在,您将不再需要为您指定的类型添加Bind
属性,使用此模型绑定器!
答案 1 :(得分:1)
BindAttribute可以在类级别使用,以避免为UserInputModel参数的每个实例重复它。
====== EDIT ==
从表单中删除前缀或在视图模型上使用BindAttribute将是最简单的选择,但另一种方法是为UserInputModel类型注册自定义模型绑定器并显式查找所需的前缀。