DefaultModelBinder не привязывает вложенную модель - PullRequest
11 голосов
/ 14 октября 2010

Похоже, у других была эта проблема, но я не могу найти решение.

У меня есть 2 модели: Person & BillingInfo:

public class Person
{
 public string Name { get; set;}
 public BillingInfo BillingInfo { get; set; }
}

public class BillingInfo
{
 public string BillingName { get; set; }
}

И я пытаюсь привязать это прямо к своему действию, используя DefaultModelBinder.

public ActionResult DoStuff(Person model)
{
 // do stuff
}

Однако, хотя свойство Person.Name установлено, BillingInfo всегда имеет значение null.

Мой пост выглядит так:

"Name = statichippo & BillingInfo.BillingName = statichippo"

Почему BillingInfo всегда имеет значение null?

Ответы [ 5 ]

9 голосов
/ 29 мая 2015

У меня была эта проблема, и ответ смотрел мне в лицо в течение нескольких часов.Я включил это здесь, потому что я искал вложенные модели, не являющиеся обязательными, и пришел к этому ответу.

Убедитесь, что свойства вашей вложенной модели, как и любой из ваших моделей, для которых вы хотите, чтобы привязка работала, имелиправильные средства доступа.

    // Will not bind!
    public string Address1;
    public string Address2;
    public string Address3;
    public string Address4;
    public string Address5;


    // Will bind
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string Address4 { get; set; }
    public string Address5 { get; set; }
6 голосов
/ 14 октября 2010

Статус отсутствует. Ваша проблема в другом месте, и вы не можете определить, откуда вы дали информацию. Связыватель модели по умолчанию прекрасно работает с вложенными классами. Я использовал его бесконечность раз, и он всегда работал.

Модель:

public class Person
{
    public string Name { get; set; }
    public BillingInfo BillingInfo { get; set; }
}

public class BillingInfo
{
    public string BillingName { get; set; }
}

Контроллер:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new Person
        {
            Name = "statichippo",
            BillingInfo = new BillingInfo
            {
                BillingName = "statichippo"
            }
        };
        return View(model);
    }

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

Вид:

<% using (Html.BeginForm()) { %>
    Name: <%: Html.EditorFor(x => x.Name) %>
    <br/>
    BillingName: <%: Html.EditorFor(x => x.BillingInfo.BillingName) %>
    <input type="submit" value="OK" />
<% } %>

Отправленные значения: Name=statichippo&BillingInfo.BillingName=statichippo идеально привязан к действию POST. То же самое работает и с GET.


Один из возможных случаев, когда это может не сработать, следующий:

public ActionResult Index(Person billingInfo)
{
    return View();
}

Обратите внимание, как параметр действия называется billingInfo, то же имя, что и у свойства BillingInfo. Убедитесь, что это не ваш случай.

1 голос
/ 29 ноября 2017

Вот что у меня сработало.

Я изменил это:

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

Кому:

[HttpPost]
    public ActionResult Index(FormCollection fc)
    {
        Person model = new Person();
        model.BillingInfo.BillingName = fc["BillingInfo.BillingName"]

        /// Add more lines to complete all properties of model as necessary.

        return View(model);
    }
0 голосов
/ 25 января 2017

У меня была та же проблема, предыдущий разработчик проекта зарегистрировал свойство у частного установщика, так как он не использовал эту модель представления в обратной передаче.Примерно так:

public MyViewModel NestedModel { get; private set; }

изменено на это:

public MyViewModel NestedModel { get; set; }
0 голосов
/ 03 мая 2013
public class MyNestedClass
{
    public string Email { get; set; }
}

public class LoginModel
{
//If you name the property as 'xmodel'(other than 'model' then it is working ok.
public MyNestedClass xmodel  {get; set;} 

//If you name the property as 'model', then is not working
public MyNestedClass model  {get; set;} 

public string Test { get; set; }
}

У меня была похожая проблема. Я потратил много часов и случайно обнаружил проблему, заключающуюся в том, что мне не следует использовать «модель» для имени свойства

@Html.TextBoxFor(m => m.xmodel.Email) //This is OK
@Html.TextBoxFor(m => m.model.Email) //This is not OK
...