Как я могу динамически внедрить частичное представление (или код) на основе текущей страницы (MVC3 / Razor)? - PullRequest
3 голосов
/ 28 февраля 2012

Я не могу получить четкий ответ по своей проблеме: я хочу иметь одно частичное представление, но иметь 3 отдельных кодовых блока в частичном с похожим (не точно таким же) содержимым. Таким образом, независимо от того, какая страница представления загружена, определите, какой из 3 блоков кода будет отображаться в частичном представлении.

Я сделал нечто подобное еще в MVC2, но это было на уровне контроллера (контроллер определил, какой из 3 кодовых блоков был отображен). Теперь мне нужно пойти глубже и сделать это на уровне страницы.

Я понимаю, что набор if/else операторов в представлении не является соглашением MVC. Но, честно говоря, это единственный способ, которым я знаю, как это сделать. Альтернатива состоит в том, чтобы сохранить эту if/else логику и создать более одного контроллера и продолжать делать это по-старому.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

Есть как минимум 4 способа сделать это.

  1. Если / иначе, как @StanK упоминает
  2. Вызовите дочернее действие из основного вида. Встроить логику в действие, чтобы отобразить другую частичку на основе указанной логики.
  3. Создайте пользовательский помощник HTML, который расширяет @ Html.Partial, проверив свою пользовательскую логику перед рендерингом другого частичного (по существу, перемещая if / else к помощнику HTML)
  4. Добавьте ОО к вашей модели. Создайте абстрактный класс и производный класс для каждого из 3 «похожих, но разных» блоков кода и соответствующий шаблон редактора для каждого. Затем на главном экране вызовите @ Html.EditorFor (model => model.SomethingDeclaredAbstract), и MVC выберет правильный шаблон.

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

Обычно я использую вариант 4, потому что он самый чистый и универсальный.

2 голосов
/ 28 февраля 2012

Если ваш частичный вид выглядит примерно так

<div>...Generic stuff used all the time...</div>
...
<div>...special block used only in some circumstances...</div>
...
<div>...another special block used only in some other circumstance...</div>
...etc...

Вы можете создать класс ViewModel, который имеет некоторые свойства, чтобы определить, какой блок кода отображать

, например

public class MyViewModel 
{
   public bool ShowBlockOne { get; set; }
   public bool ShowBlockTwo { get; set; }
}

Тогда ваш частичный вид будет выглядеть примерно так

@model MyViewModel 
<div>...Generic stuff used all the time...</div>
...
@if (Model.ShowBlockOne) {
    <div>...special block used only in some circumstances...</div>
}
...
@if (Model.ShowBlockTwo) {
    <div>...another special block used only in some other circumstance...</div>
}
...etc...

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

@{ Html.RenderPartial("MyPartial", new MyViewModel { ShowBlockOne = true } ); }

Вы должны быть в состоянии использовать некоторые варианты этого.

Как вы знаете, вы должны сводить логику к минимуму в своих представлениях, но иногда, если / то в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...