Как связать ViewModel, который имеет свойства sub-viewmodel? - PullRequest
2 голосов
/ 15 апреля 2011

Мне любопытно узнать, как лучше всего подойти к следующему сценарию:

public class LittleThingViewModel
{
    public string Id{ get; set; }
    public string Name { get; set; }
    public string Location { get; set; }
}

public class BigThingViewModel
{
    public LittleThingViewModel little1 {get; set; }
    public LittleThingViewModel little2 {get; set; }
    public string propA {get; set; }
    public string propB {get; set; }
    public string propC {get; set; }
}

В начальном действии CREATE моего контроллера я заполняю две LittleThingViewModel, назначаю их новому BigThingViewModel и передаю его встрого типизированное представление.Затем я использую EditorFor для визуализации элементов управления редактирования для свойств BigThing A, B и C.

Каков наилучший метод для автоматического рендеринга LittleThingViewModels в форму таким образом, чтобы при отправке обратно в мой контроллер он автоматически связывался?(Моя цель - отображать только Имя и скрывать другие свойства)

public ActionResult Create(BigThingViewModel b) 

Я обнаружил, что могу отображать свойства A, B и C в дополнение к каждому отдельному свойству двух подтипов LittleThing.viewmodels и он успешно связывает BigThingViewModel во время POST:

Html.DisplayFor(model=>model.little1.Name)
Html.HiddenFor(model=>model.little1.Name)
Html.HiddenFor(model=>model.little1.Id)
Html.HiddenFor(model=>model.little1.Location)

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

Что-то вроде:

Html.RenderFor(model=>model.little1)

Спасибо

1 Ответ

2 голосов
/ 15 апреля 2011

Создать частичное представление , строго типизированное для LittleThingViewModel.

LittleThingView.ascx (частичное представление)

Html.DisplayFor(model=>model.Name)
Html.HiddenFor(model=>model.Name)
Html.HiddenFor(model=>model.Id)
Html.HiddenFor(model=>model.Location)

В главном представлении

<%
Html.RenderPartial("LittleThingView",model.little1);
Html.RenderPartial("LittleThingView",model.little2);
%>

Чтобы он выглядел лучше, вы можете создать коллекцию для этих объектов в большомViewModel.Поэтому, если один из них равен нулю или вам нужно более одного, он не потребует никаких изменений.

public class BigThingViewModel
{
    public List<LittleThingViewModel> littles=new List<LittleThingViewModel>();
    public string propA {get; set; }
    public string propB {get; set; }
    public string propC {get; set; }
}

И в представлении:

<%
foreach(var littleThingViewModel in model.littles)
{
    Html.RenderPartial("LittleThingView",littleThingViewModel);
}
%>
...