Частичная viewmodel пуста при публикации в контроллер - PullRequest
0 голосов
/ 10 июня 2018

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

public class AggregateVM
{
    public BrandVM BrandVM { get; set; }
    public TinTypeVM TinTypeVM { get; set; }
}

Когда я отправляю http-сообщение в действие контроллера, TinTypeVM заполняется моими отредактированными значениями, но моделью представления BrandVM, в которой я использовал частичноевсегда ноль.

Вот вид.

@model SaveEF.ViewModels.AggregateVM
@using (Html.BeginForm("EditAggregate", "Aggregate")) 
{
    @Html.Partial("_EditBrand", Model.BrandVM)

    @Html.Label("Tin Name")
    @Html.EditorFor(model => model.TinTypeVM.Name)
    <input type="submit" value="Save" />
}

Вот частичное представление.

@model SaveEF.ViewModels.BrandVM
@Html.Label("Brand Name")
@Html.EditorFor(model => model.Name)

Вот действие контроллера.

public ActionResult EditAggregate(AggregateVM vm)
{
    SaveBrand(vm.BrandVM);
    SaveTinType(vm.TinTypeVM);
    return RedirectToAction("Index");
}

Как я могу использовать частичные в представлении и при этом передать одинпросмотреть модель в действии EditAggregate?Я пробовал разные параметры в Html.BeginForm («EditAggregate», «Aggregate», FormMethod.Post, new {vm = Model})), но это не помогло.

1 Ответ

0 голосов
/ 10 июня 2018

Короткий ответ

Вам также необходимо передать AggregateVM в свою часть.

Длинный ответ

То, как вы делаете это прямо сейчас:

@model SaveEF.ViewModels.BrandVM
@Html.EditorFor(model => model.Name)

Так что, если бы вы проверяли сгенерированный nameдля редактора будет Name.Таким образом, когда вы публикуете, связыватель модели MVC по умолчанию будет искать подходящее свойство в вашей модели представления.Но вы смотрите модель выглядит следующим образом:

public class AggregateVM
{
    public BrandVM BrandVM { get; set; }
    public TinTypeVM TinTypeVM { get; set; }
}

И нет Name свойство.

Исправление

Вам необходимо также передать AggregateVM вашему частичному.

@model SaveEF.ViewModels.AggregateVM
@Html.EditorFor(model => model.BrandVM.Name)

и теперь имя редактора будет BrandVM.Name.Поэтому при публикации средство связывания модели по умолчанию будет искать свойство BrandVM.Name и найдет его.Таким образом, это заполнит это.

Другая альтернатива - указать атрибут name самостоятельно с помощью @Html.Editor или передать атрибут.

...