ModelBinder по умолчанию не работает должным образом

У меня есть следующая структура:

public class Dummy
{
    public string Name { get; set; }

    public InnerDummy Dum { get; set; }
}

public class InnerDummy
{
    public string Name { get; set; }
}

И ActionResult, который получает Dummy

[HttpPost]
public ActionResult Index(Dummy dum)
{
    var dsad = dum;
    //var dwss = idum;

    return RedirectToAction("index");
}

На мой взгляд у меня есть:

@model TestMVC3Razor.Controllers.HomeController.Dummy
@using (Html.BeginForm())
{
    @Html.TextBoxFor(o => o.Name)
    @Html.EditorFor(o => o.Dum)

    <br />
    <br />
    <input type="submit" />
}

он публикует

Name=xxx
Dum.Name=yyy

Но когда я пытаюсь получить dum.Dum.Name на ActionResult, я получаю null вместо yyy. Это баг или так оно и есть? Я не правильно его использую? Нужно ли для этого реализовывать новый связующий?


person BrunoLM    schedule 12.05.2011    source источник


Ответы (2)


HI~ ваше представление должно использовать @Html.EditorFor(o => o.Dum.Name)

не @Html.EditorFor(o => o.Dum)

И контроллер обратной передачи:

[HttpPost]
public ActionResult Index(Dummy postback)
{
    var dsad = postback;
    var a = postback.Name;        //get Name of Dummy
    var b = postback.Dum.Name;    //get Name of InnerDummy of Dummy

    return RedirectToAction("index");
}

Если у вас есть проблемы с этим, пожалуйста, дайте мне знать :)

person Maidot    schedule 12.05.2011
comment
dum.Dum.Name имеет значение null, а dum.Name имеет опубликованное значение Dum.Name. Я пробовал разные имена для свойств, но потом я получаю нуль для обоих. - person BrunoLM; 12.05.2011
comment
Удаление любого типа редактора для Dum.Name приводит к правильной привязке опубликованного значения к простому свойству Name из Dummy. - person BrunoLM; 12.05.2011
comment
Привет~ Попробуй мой код выше, используй другое имя переменной обратной передачи, я думаю, что дум запутает ModelBinder, так что теперь он работает правильно :) - person Maidot; 12.05.2011
comment
Кстати, спасибо BrunoLM :), баг интересный и такой странный. Поскольку C# чувствителен к регистру, я думаю, что в этом случае ошибки быть не должно. - person Maidot; 12.05.2011
comment
Я думаю, проблема в том, что имена значений POST нечувствительны к регистру. - person Andrew Cooper; 12.05.2011
comment
Хороший улов, так что у связующего по умолчанию есть небольшая проблема... Спасибо :) - person BrunoLM; 12.05.2011

Вам нужно вытащить InnerDummy из класса Dummy.

Когда связыватель модели по умолчанию находит свойство Dum, он пытается создать объект типа InnerDummy, но в своем контексте он не существует. Чтобы сослаться на InnerDummy в том виде, в каком он у вас есть, компоновщик модели должен создать Dummy.InnerDummy, но он не может этого узнать.

Создание InnerDummy прямым членом пространства имен решит проблему.

Также возможно решить проблему, объявив Dum как:

public Dummy.InnerDummy Dum { get; set; }

Но я не уверен в этом.

person Andrew Cooper    schedule 12.05.2011
comment
Я удалил его, но он все еще не привязывается - person BrunoLM; 12.05.2011