Пользовательский ModelBinder с вложенными моделями представления - PullRequest
3 голосов
/ 27 июня 2011

У меня есть следующие модели представления:

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());

Однако - связыватель никогда не вызывается.Это потому что оно вложено?достаточно ли умен фреймворк, чтобы увидеть, что есть дочерняя модель представления требуемого типа для соответствия этому связующему?

[edit]

вот код для связывателя модели (хотя он никогда не достигает этоготочка):

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;
        }

w: //

1 Ответ

2 голосов
/ 29 июня 2011

Это должно работать, по крайней мере, это работает для меня.Я взял тот же код, который вы показали.Единственное, что вы не показали, это вид.

Итак, я проверил следующее:

~/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)

Когда я отправил форму, привязка пользовательской модели была запущена, как и ожидалось.

...