2012-05-26 3 views
2

У меня есть представление, которое содержит много частичных представлений, и мне нужно передать каждому из них подходящую модель.Многие модели для просмотра со многими частичными представлениями

Я нашел 2 способа сделать это, но я не знаю, как это реально сделать.

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

  2. Другой способ, который я имею, имеет методы в каждой модели, которые приносят мне модель для каждого частичного представления (GetMenuBar() и т. Д.).

Каков правильный путь?

+1

Не могли бы вы объяснить, что вы имеете в виду под этим: «' проблемы заключается в том, что его жестко напечатано, и если мне нужно пройти разное сочетание моделей, он не будет соответствовать. – Yakimych

+2

Это звучит как отличный кандидат на сегрегацию интерфейса - пусть объект модели реализует интерфейс для каждого частичного его включения. – arootbeer

+1

@arootbeer Я согласен, это именно то, что я использую в своем текущем проекте. Так же как абстрактные и/или унаследованные классы для виртуальных машин –

ответ

8

Мой совет, перейдите к Варианту 1. Я использую это со всеми сценами Main View/Multiple Partial View. Он прост в обслуживании, так как каждый частичный имеет свой собственный ViewModel. Он держит все это красивый и чистый

Я использую ту же самую установку следующим образом:

public class MainViewModel { 

    public Partial1ViewModel Partial1 [ get; set; } 
    public Partial2ViewModel Partial2 [ get; set; } 
    public Partial3ViewModel Partial3 { get; set; } 
    public Partial4ViewModel Partial4 { get; set; } 

    public MainViewModel() {} 

    public MainViewModel() { 
     Partial1 = new Partial1ViewModel(); 
     Partial2 = new Partial2ViewModel(); 
     Partial3 = new Partial3ViewModel(); 
     Partial4 = new Partial4ViewModel(); 
    } 
} 

Каждый PartialViewXViewModel это собственный ViewModel и в случае необходимости быть может быть повторно использована в другой точке зрения.

Ваши действия, что делает может выглядеть так:

public ActionResult Index { 
    var model = new MainViewModel(); 
    return View(model); 
} 

Ваш взгляд

@model MainViewModel 

<div> 
    {@Html.RenderPartial("PartialOne", Model.Partial1)} 
</div> 


<div> 
    {@Html.RenderPartial("PartialTwo", Model.Partial2)} 
</div> 


<div> 
    {@Html.RenderPartial("PartialThree", Model.Partial3)} 
</div> 


<div> 
    {@Html.RenderPartial("PartialFour", Model.Partial4)} 
</div> 

Определение пользовательского интерфейса для каждого PartialX как:

@model Partial1ViewModel 

//view html here 

Теперь каждый Частичный вид HTML и каждая используемая ими модель может использоваться где угодно.

Большая часть сейчас, если у вас есть страница, которая нуждается только 2 из них вы просто создать новый ViewModel, чтобы представить, что конкретный вид, как так:

public class OtherMainViewModel { 

    public Partial2ViewModel Partial2 [ get; set; } 
    public Partial4ViewModel Partial4 { get; set; } 

    public OtherMainViewModel() {} 

    public OtherMainViewModel() { 
     Partial2 = new Partial2ViewModel(); 
     Partial4 = new Partial4ViewModel(); 
    } 
} 

И использовать его в другой точке зрения, как так:

public ActionResult SomeOtherAction { 
    var model = new OtherMainViewModel(); 
    return View(model); 
} 

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

Возможно, вы захотите использовать другой метод для заполнения ваших моделей. Большинство здесь рекомендуют использовать Automapper. В любом случае приведенное выше просто инициализирует PartialViewXModels в конструкторе MainViewModel. Это не обязательно будет вашим делом, если вы заполняете эти модели данными из вашей БД. Для этого вам нужна ваша собственная стратегия.Это будет работать здесь:

public ActionResult Index { 
    var model = new MainViewModel(); 
    model.Partial1 = GetPartial1Data(); // this method would return Partial1ViewModel instance 
    model.Partial2 = GetPartial2Data(); // same as above for Partial2ViewModel 
    ... 
    return View(model); 
} 

Это все просто, чтобы вы начали с дизайном, вы можете настроить его в ваших сердцах содержание :-)

+0

Вы создаете «MainViewModel» для каждой страницы? например - «MainPageViewModel», «ArticlesPageViewModel» и т. Д., или у вас есть на каждом элементе управления/странице одна и та же модель, и вы используете то, что вам нужно? второй вариант, который я могу понять, может использовать любое имущество, которое вы хотите, его не над заголовком? –

+0

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

+0

Спасибо, я многому научился о перспективах MVC дизайна :) –

Смежные вопросы