1

我查看了大多数 ModelBinding 示例,但似乎无法收集到我要查找的内容。

我想要:

<%= Html.TextBox("User.FirstName") %>
<%= Html.TextBox("User.LastName") %>

在 post 上绑定到这个方法

public ActionResult Index(UserInputModel input) {}

用户输入模型在哪里

public class UserInputModel {
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

约定是使用没有“InputModel”的类名,但我不想每次都用 BindAttribute 指定这个,即:

public ActionResult Index([Bind(Prefix="User")]UserInputModel input) {}

我尝试过覆盖 DefaultModelBinder,但似乎找不到合适的位置来注入这一点功能。

4

2 回答 2

2

传递给函数的对象中的ModelName属性是您要设置的。这是一个执行此操作的模型绑定器:ModelBindingContextBindModel

 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使用此模型绑定器为您指定的类型添加属性!

于 2011-09-10T16:30:46.990 回答
1

BindAttribute 可以在类级别使用,以避免为 UserInputModel 参数的每个实例重复它。

======编辑======

仅从表单中删除前缀或在视图模型上使用 BindAttribute 将是最简单的选择,但另一种方法是为 UserInputModel 类型注册自定义模型绑定器并显式查找所需的前缀。

于 2010-07-18T07:12:43.617 回答