具有嵌套视图模型的自定义ModelBinder

时间:2011-06-27 10:26:21

标签: asp.net-mvc asp.net-mvc-3 model-binding

我有以下viewmodels:

public class ViewModel1{
    public string Foo{get;set;}
}

public class ViewModel2{
     public ViewModel1 Bar{get;set;}
}

以下控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new ViewModel2();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ViewModel2 model)
    {
        return View(model);
    }
}

我有一个自定义模型绑定器配置为:

 ModelBinders.Binders.Add(typeof(ViewModel1), new ViewModel1ModelBinder());

然而 - 粘合剂永远不会被调用。这是因为它是嵌套的吗?框架是否足够聪明,可以看到有一个所需类型的子视图模型来匹配这个绑定器?

[编辑]

这里是模型绑定器的代码(虽然它永远不会到达这一点):

protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
        {
            var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".TableInputModelTypeName");
            string typeAndNS = modelType.Namespace + "." + typeValue.AttemptedValue;
            var type = Type.GetType(typeAndNS, true);
            var model = Activator.CreateInstance(type);
            bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
            return model;
        }

瓦特://

1 个答案:

答案 0 :(得分:2)

这应该有用,至少它对我有用。我采用了你所展示的完全相同的代码。你唯一没有看到的是视图。

所以我测试了以下内容:

~/Views/Home/Index.cshtml

@model ViewModel2
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Bar)
    <input type="submit" value="OK" />
}

和编辑器模板(~/Views/Home/EditorTemplates/ViewModel1.cshtml):

@model ViewModel1
@Html.Hidden("TableInputModelTypeName", "foobar")
@Html.EditorFor(x => x.Foo)

当我提交表单时,自定义模型绑定器按预期命中。