2014-01-16 3 views
0

Связующее устройство по умолчанию не отображает коллекции в моей модели. Вот мой код:Связывание модели ASP.NET MVC 4.0, не работающее с коллекцией

Модель:

public class Company 
{ 
    public string Name; 
    public List<CompanyActivity> Activities 
} 

public class CompanyActivity 
{ 
    public string Code; 
    public string Description 
} 

Контроллер:

[HttpPost] 
public ActionResult Index(Company company) {} 

Посмотреть/HTML:

<input name="Name" type="text" value="some name" /> 
<input name="Activities[0].Code" type="text" value="1" /> 
<input name="Activities[0].Description" type="text" value="a" /> 
<input name="Activities[1].Code" type="text" value="2" /> 
<input name="Activities[1].Description" type="text" value="b" /> 

ввода Имя отображается, но список Деятельность пуст.

+0

HTML, вы дали показывает на 'значение =«»' атрибут как пустой. Что происходит, когда вы предоставляете значения? Кроме того, каков ваш источник просмотра MVC? – Dai

+0

Я обновил свой код – jlp

ответ

1

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

public class Company 
{ 
    public string Name { get; set; } 
    public List<CompanyActivity> Activities { get; set; } 
} 

public class CompanyActivity 
{ 
    public string Code { get; set; } 
    public string Description { get; set; } 
} 

Различия между полями и свойствами: Difference between Property and Field in C# 3.0+ и ASP.net MVC - Model binding excludes class fields?

+0

Это не помогло. – jlp

+0

почему? Я создал proyect с вашим кодом. Без свойств не связывать и со свойствами связывать должным образом. HTML правильный, как я уже сказал, я добавил только {get; set;}, и он отлично работает. –

+0

Интересно, что я не понимал, что modelbinder был достаточно умен, чтобы сделать это, используя синтаксис имен. Мой ответ не так хорош в сравнении. – Oliver

0

Имена должны быть одинаковыми для того, чтобы построить их как сбор/массив:

Я бы создать ViewModel, чтобы справиться с этим делом, поэтому я почти всегда строить ViewModel для обработки вид рендеринга и идиосинкразии MVC.

Модель

public class Company 
{ 
    public string Name; 
    public List<CompanyActivity> Activities 
} 

ViewModel

public class CompanyViewModel 
{ 
    public string Name; 

    //View specific 
    public List<int> CompanyActivityCodes 
} 

Посмотреть

<input name="Name" type="text" value="" /> 
<input name="CompanyActivityCodes" type="text" value="" /> 
<input name="CompanyActivityCodes" type="text" value="" /> 

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

public ActionResult Index(CompanyViewModel companyViewModel) 
{ 
    var company = new Company { Name = companyViewModel }; 
    company.Activities = companyViewModel.CompanyActivityCodes.Select(x => new CompanyActivity { Code = x }); 
} 
+0

Я обновил свой код. Действия - это список объектов, а не список int. – jlp

+0

Да, но это не так уж умно, когда он может определить вложенные свойства при использовании коллекций. – Oliver

+0

Насколько я понимаю, модельный блок недостаточно развит, но для определения вложенных свойств при работе с коллекциями. По этой причине я создал ViewModel, который по существу «сглаживает» ваш класс CompanyActivity в плоский класс. Как вы видите, я назвал свойство CompanyActivityCodes, поскольку он сглаживает свойство кода в коллекции действий. Вы отредактировали вопрос, включив дополнительные свойства, которые усложняют ситуацию. – Oliver

0

это shoould быть

<input name="company.Activities[0].Code" type="text" value="" /> 
Смежные вопросы