Обязательная модель с дочерним списком бритвы MVC 3 - PullRequest
0 голосов
/ 16 ноября 2011

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

    public class ContratoDetailsViewModel
    {
        [StringLength(50)]
        [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$")]
        [DisplayName("E-Mail Adm.")]
        public string emailAdm { get; set; }
    }


    public class ContratoDetailContainerViewModel
    {
        public ContratoDetailsViewModel contrato { get; set; }
        public IList<ContratoModels.CCasinoViewModel> ccasinos { get; set; }
    }

    public class CCasinoViewModel
    {
        public short codigo { get; set; }
        public List<SelectListItem> listCasinos { get; set; }
    }

следующий вид:

@model ContratoModels.ContratoDetailContainerViewModel
@{
    ...
}
@using (Html.BeginForm(new { currentaction = ViewBag.mode }))
{
...
@Html.EditorFor(m => m.contrato.emailAdm, state1)<br />
@Html.EditorFor(m => m.ccasinos,"test")
<input type="submit" value="Save" />
}

в папке "EditorTemplates" у меня есть шаблон с именем "test.cshtml":

@model List<ContratoModels.CCasinoViewModel>
@for (int i = 0; i < Model.Count(); i++)
{
    @Html.DropDownListFor(m => m[i].codigo,Model[i].listCasinos)
}

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

[HttpPost]
    public ActionResult Details(ContratoModels.ContratoDetailContainerViewModel model, FormCollection form)
    {
           var contrato = model.contrato;
           var casinos = model.ccasinos;
    }

Перед отправкой инициализируются ccasinos, codigo и listCasinos. когда я нахожусь в режиме отладки, я вижу их значение ... отображение формы работает как шарм. НО ... когда я отправляю форму, модель.ccasinos всегда пуста !! Зачем ? Большое спасибо за ваш ответ.

примечание: я использую EditorFor с дочерним элементом моей основной модели, но если есть лучшее решение для отображения и отправки с MCV 3 мне интересно ...

1 Ответ

2 голосов
/ 16 ноября 2011

Попробуйте заменить:

@Html.EditorFor(m => m.ccasinos, "test")

на это:

@Html.EditorFor(m => m.ccasinos)

, а затем переименуйте шаблон test.cshtml в CCasinoViewModel.cshtml и замените его содержимое следующим:

@model CCasinoViewModel
@Html.DropDownListFor(x => x.codigo, Model.listCasinos)

Поскольку шаблон редактора теперь называется так же, как и тип списка, ASP.NET MVC автоматически отобразит его для каждого элемента этого списка, чтобы вам не приходилось писать циклы.

Также вы можете безопасно удалить аргумент FormCollection из вашего действия.Это абсолютно бесполезно, когда вы работаете с моделями представления:

[HttpPost]
public ActionResult Details(ContratoModels.ContratoDetailContainerViewModel model)
{
    var contrato = model.contrato;
    var casinos = model.ccasinos;
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...