Как связать коллекцию (IEnumerable) пользовательского типа? - PullRequest
7 голосов
/ 02 июня 2011

У меня есть следующее действие для отображения формы с 3 элементами:

[HttpGet]
    public ActionResult ReferAFriend()
    {
        List<ReferAFriendModel> friends = new List<ReferAFriendModel>();
        ReferAFriendModel f1 = new ReferAFriendModel();
        ReferAFriendModel f2 = new ReferAFriendModel();
        ReferAFriendModel f3 = new ReferAFriendModel();

        friends.Add(f1);
        friends.Add(f2);
        friends.Add(f3);
        return View(friends);
    }

и затем действие публикации

[HttpPost]
    public ActionResult ReferAFriend(IEnumerable<ReferAFriendModel> friends)
    {
        if(ModelState.IsValid){

РЕДАКТИРОВАТЬ Мой вид выглядитthis:

@model IEnumerable<Models.ReferAFriendModel>
@for(int i=0;i<Model.Count();i++)
    {
        @Html.Partial("_ReferAFriend", Model.ElementAt(i));
    }

Частичное выглядит следующим образом:

@model Models.ReferAFriendModel
<p>
   @Html.LabelFor(i => i.FullName) @Html.TextBoxFor(i => i.FullName)<br />
   @Html.LabelFor(i => i.EmailAddress) @Html.TextBoxFor(i => i.EmailAddress)
   @Html.HiddenFor(i=>i.Id)
</p>

Когда я публикую сообщение, я вижу, что поля публикуются в объекте Request.Form, например, Request.Form ["FullName»] покажет:« Дэвид Бекхэм »,« Тьерри Анри ».«Чичарито Фергурсон», которые являются значениями, которые я ввел в форму. Но в действии Post значение 'friends' всегда равно null. ReferAFriendModel имеет три открытых свойства Id, EmailAddress и FullName.

Что я делаю не так?

1 Ответ

9 голосов
/ 02 июня 2011

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

@model IEnumerable<ReferAFriendModel>
@using (Html.BEginForm())
{
    @Html.EditorForModel()
    <input type="submit" value="OK" />
}

и в соответствующем шаблоне редактора (~/Views/Shared/EditorTemplates/ReferAFriendModel.cshtml):

@model ReferAFriendModel
@Html.EditorFor(x => x.Prop1)
@Html.EditorFor(x => x.Prop2)
...
...