2009-12-14 4 views
2

Это скорее вопрос архитектора, а не тот, который требует кода.ASP.NET MVC - PartialView Архитектурный вопрос

У меня есть страница, которая требует, чтобы я отображал статус конкретного проекта. Скажем ради или краткости, что есть два состояния: «Открыть» и «Закрыто».

Когда проект открыт, я хочу отобразить PartialView, показывающий мне один набор деталей. Если проект закрыт, я хочу показать PartialView с различными деталями.

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

Кроме того, существует более двух состояний, поэтому утверждения «если» будут накапливаться и стать беспорядочными.

Неужели кто-нибудь решил что-то подобное?

Должен ли я создать помощника для этого? Могу ли я, и я не уверен, как это сделать, справитесь с этим в ActionResult представления? Так, например, можно ли обработать PartialView в результате действия и вернуть его как часть обычного вида?

ответ

7

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

if (Project.Status == "Open") { 
    ViewData["StatusPartial"] = "OpenPartial"; 
} else { 
    ViewData["StatusPartial"] = "ClosedPartial"; 
} 

Тогда в ASPX просто сделать

<%=Html.RenderPartial(ViewData["StatusPartial"]) %> 
+0

+1. Мне нравится эта идея. Благодарю. – griegs

+0

Очень просто и сохраняет логику, где она должна быть. Мне это нравится. –

+0

Это, безусловно, самое простое решение, но у него есть несколько недостатков: * «Волшебные струны» (ну, может быть, не такая магия, но они не сильно типизированы) * Резервное сохранение информации о статусе проекта в двух places ('ViewData [" StatusPartial "]' и в свойстве объекта модели) –

5

Если код статуса вашего проекта как Enum, вы могли бы на самом деле просто получить правильное частичное быть показаны без каких-либо, если положения в любой момент, используя this neat trick:

<% Html.RenderPartial(Enum.GetName(typeof(ProjStat), prj.Status) + 'Partial'); %> 

В приведенных выше примере я предположил, что название Enum является ProjStat, и что у вас есть именование вашего частичного вида, соответствующее OpenPartial.ascx и ClosedPartial.ascx для двух значений статуса Open и Closed.

+0

Это довольно крутое решение! Хорошая идея! –

+0

+1, да, это на самом деле довольно аккуратно. – griegs

4

Мне нравится решение @Chris Gutierrez, но я бы использовал свойство на вашем ViewModel, а не именованную запись в ViewData. Вы могли бы объединить, что с карты на контроллер, чтобы сэкономить немного кода - образец предполагает, что Status.Open карты 0 и Status.Closed карты 1.

private readonly static string[] StatusViews 
    = new string[] { "OpenPartial", "ClosedPartial" }; 

... 
model.StatusView = StatusViews[(int)Project.Status]; 


<%= Html.RenderPartial(Model.StatusView) %> 
+0

+1. Правильно, и чтобы сделать его расширяемым, я мог загружать значения из db или config. – griegs

+0

Это хорошая модификация решения Криса - однако вполне вероятно, что представление уже передает другие вещи об этом проекте, и кажется излишним иметь статус как свойство объекта «Проект» и как отдельное свойство на «ViewModel». –

+0

Grnated Я работаю с MVC чуть больше года, но модель, к которой я тяготеет, представляет собой отдельную модель View-only для каждого представления. Эта модель представления обычно обертывает бизнес-модель несколькими дополнительными элементами для представления, такими как, в данном случае, частичное, чтобы выбрать, есть ли опции. Я точно не знаю, как бы я справился с этим - я не так неохотно использую логику в своих представлениях **, и ** выбор того, как сделать что-то, кажется мне функцией функции, а не контроллера , Вероятно, я просто использовал бы конструкцию if/then/else в представлении на основе свойства модели. – tvanfosson

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