2014-12-10 3 views
1

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

Индексный:

<a href="@Url.Action("Create", "WidgetEditor", new { wType = "image" })"><i class="fa fa-image"></i> Create Image Widget</a> - 
<a href="@Url.Action("Create", "WidgetEditor", new { wType = "text" })"><i class="fa fa-file-text"></i> Create Text Widget</a> 

Создать Действие:

public ActionResult Create(string wType) 
{ 
    ViewBag.wType = wType; 
    return View(); 
} 

тип затем передается в поле зрения с помощью ViewBag.wType и это оценивается в Create View

Создать вид:

@using (Html.BeginForm()) 
{ 
    <section class="row"> 
    @{ 
     if (ViewBag.wType == "image") 
     { 
      Html.RenderPartial("~/Views/WidgetEditor/_CreateImageWidget.cshtml"); 
     } 
     else if (ViewBag.wType == "text") 
     { 
      Html.RenderPartial("~/Views/WidgetEditor/_CreateTextWidget.cshtml"); 
     } 
    } 
    </section> 
} 

, и в зависимости от этого загружается соответствующее частичное представление. Частичные виды имеют разные модели, поэтому, когда форма отправлена, я не знаю, как какая модель возвращается. Один из _CreateImageWidget или _CreateTextWidget.

Если контроллер HttpPost выглядеть следующим образом

[HttpPost] 
public ActionResult Create(DisplayWidgetImageViewModel imageModel, DisplayWidgetTextViewModel textModel) 
{ 
    return new ViewResult(); 
} 

я получить заселенной imageModel если _CreateImageWidget парциальное выбран и TextMode если _CreateTextWidget частичный выбран.

Это приемлемо, количество типов виджетов не изменяется, но это не так. Есть ли способ получить какую-то конкретную модель из частичного представления и узнать/узнать, какой она есть, или я делаю это совершенно неправильно?

+0

Существует аналогичная проблема с решением, которое выглядит перспективным здесь http://stackoverflow.com/questions/4922339/determine-the-model-of-a-partial-view-from-the-controller-within-mvc ? rq = 1 – vidriduch

ответ

1

Вы можете создать несколько форм на одной странице. Вы также можете использовать различные методы действий на частичный:

@using (Html.BeginForm("Action", "Controller")) { 
    Html.RenderPartial("~/Views/WidgetEditor/_CreateImageWidget.cshtml") 
} 

Вы все это без использования Ajax.

+0

Это шаг вперед, но если у вас 20 виджета, у меня будет 20 форм ... хотя, если форма является частью частичного представления ... но у меня все еще будет много действия ... – vidriduch

+0

К сожалению, связующее по умолчанию должно знать явный тип. Еще одна вещь, которую вы могли бы сделать, это настроить настраиваемое связующее. Пользовательское связующее может действовать на родительский тип или класс. Таким образом, вы используете только одно действие. – beautifulcoder

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