Можете ли вы поместить PartialView в объект ViewData?

Я пытаюсь имитировать функциональность мультипросмотра веб-форм, и единственный способ, который я могу придумать, - это поместить PartialView в объект ViewData? Что-то вроде следующего:

Посмотреть код:

<%= ViewData["PartialViewPlaceholder"] %>

Код контроллера:

if(//condition){    
    ViewData["PartialViewPlaceholder"] = partialView1;
} else {
    ViewData["PartialViewPlaceholder"] = partialView2;
}

Как бы вы это сделали?


person shahidaltaf    schedule 18.08.2010    source источник


Ответы (1)


ViewData должен содержать фактические данные, а не сами представления, которые содержат код разметки и рендеринга. Не могли бы вы сделать это:

public ActionResult MyActionMethod()
{
    var model = new MyModel();
    model.UsePartialView1 = false; // Tell the view not to use Partial View 1
    return View("MyView", model);
}    

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

<% if (Model.UsePartialView1) 
       Html.RenderPartial("PartialView1", Model);
   else
       Html.RenderPartial("PartialView2", Model); %>

Это будет отображать либо PartialView1, либо PartialView2 с использованием одной и той же модели в зависимости от условия, установленного контроллером.

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

public ActionResult MyActionMethod()
{
    var model = ...
    ViewData["MyViewData"] = ...
    return PartialView("PartialView1", model);
}

Это вернет частичное представление PartialView1 непосредственно клиенту. Это в основном полезно в сценариях AJAX, поскольку результатом, скорее всего, будет не вся HTML-страница. Частичные представления — это .ascx файлов.

person bzlm    schedule 18.08.2010
comment
В идеале мне нужно управлять визуализируемым PartielView через контроллер. Как это сделать? - person shahidaltaf; 18.08.2010
comment
@ shahid81 Зачем тебе это нужно? Каков ваш сценарий? Вы по-прежнему можете управлять тем, какое частичное представление отображается через контроллер, используя метод, который я описал, при условии, что контроллер определяет, выполняется ли condition. - person bzlm; 18.08.2010
comment
У меня есть небольшая форма с несколькими результатами, разными экранами подтверждения, но я не хочу иметь разные URL-адреса. Подобно тому, как веб-формы используют Multiviews. - person shahidaltaf; 18.08.2010
comment
@ shahid81 URL-адрес связан с методом действия, поэтому вы можете использовать один и тот же URL-адрес для любого результата. Если контроллер знает результат и, следовательно, какой частичный вид отображать, почему бы не использовать мой метод? Или вернуть частичное представление непосредственно из контроллера? - person bzlm; 18.08.2010
comment
@bzlm Как мне вернуть частичное представление непосредственно из моего контроллера? Пример кода? - person shahidaltaf; 18.08.2010
comment
@ shahid81 shahid81 Я обновил свой ответ. Но я не думаю, что вам можно помочь без дополнительной информации о том, чего вы хотите достичь. - person bzlm; 18.08.2010
comment
спасибо @bzlm. По сути, я хочу выполнить динамическую вставку PartialView в представление с помощью метода действия. Я не возражаю против использования вашего метода, но я не понимаю, как управлять вашим кодом представления с помощью оператора «если» из контроллера. - person shahidaltaf; 18.08.2010
comment
@ shahid81 Я снова обновил свой ответ. Теперь стало понятнее? - person bzlm; 18.08.2010
comment
Хотя это возможно с помощью какой-то жуткой магии, такой как сериализация представлений, делать это неправильно, и вам следует перечитать этот ответ. Не злоупотребляйте инструментами, Вы стреляете себе в ногу. - person Arnis Lapsa; 18.08.2010