2015-03-06 3 views
0

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

У меня есть представление, которое отображает несколько/динамических частичных представлений (эти представления выбираются в зависимости от пакета, который ранее был выбран пользователем), все эти частичные представления имеют разные модели, и мне нужно отправить их в один большой «родительский» формы. Моя главная забота - что должен получить контроллер? и как обрабатывать всю информацию внутри него, поскольку у меня есть несколько и переменных моделей (в зависимости от того, что пользователь выбирает), которые отправляются из формы.

Это мое родительское представление, которое отображает все частичные виды, в зависимости от того, какой пакет выбрал пользователь (т. Е. Родительский вид может отображать от 1 до 7 форм, все они имеют разные модели). Строка IEnumerable содержит список строк, которые я буду использовать, чтобы выплевывать словарь с представлениями и моделями, чтобы сделать их позже в этом представлении.

@using UI.Shared.Utils 
@model IEnumerable<string> 
@{ 
    var forms = CustomFormUtil.GetCustomMetaPartial(Model);  
}      
@using (Html.BeginForm(MVC.Service.NewOrderRequest.Index(**I am confused what to pass here**), FormMethod.Post)) 
{ 
    foreach (var form in forms) 
    { 
    { Html.RenderPartial(form.View, form.Model); } 
    } 
    <p style="clear: both"> 
    <input id="submitNOR" type="submit" value="Submit" style="float: right" /> 
    </p> 
} 

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

Это мой контроллер:

[HttpPost] 
[SaveModelState] 
public virtual RedirectToRouteResult Index(**What should I receive**) 
{ 
    if (!ModelState.IsValid) 
    { 
    ModelState.AddModelError("error", "Please fill out the required fields"); 
    return RedirectToAction(MVC.Service.NewOrderRequestForms.Index()); 
    } 
    ... 
} 

Моя главная забота, что должно получить контроллер? Я попробовал следующее:

[HttpPost] 
[SaveModelState] 
public virtual RedirectToRouteResult Index(IEnumerable<ICustomModel> models) 

, но после некоторых исследований это не возможно, также я попытался пройти все возможные модели к контроллеру

[HttpPost] 
[SaveModelState] 
public virtual RedirectToRouteResult Index(Model1 model1, ..., ModelN modeln) 

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

namespace UI.Next.Areas.Service.Models 
{ 
    public class TdlMasterModel : ICustomMetaModel 
    { 
    public TdlMasterModel() 
    { 
    } 
    public TdlMasterModel(Guid? accountId) 
    { 
     AccountId = accountId; 
    } 
    public Guid? AccountId { get; set; } 
    public Model1 model1{ get; set; } 
    ... 
    public ModelN modeln{ get; set; } 
    } 
} 

контроллер:

[HttpPost] 
[SaveModelState] 
public virtual RedirectToRouteResult Index(MasterModel masterModel) 

До сих пор ни одно из предлагаемых решений не работало. Есть ли прямое решение для этого или мне придется создать ModelBinder, чтобы справиться с этим.

+0

Q1 - Ничто не должно быть в 'BeginForm' если GET и Методы POST одинаковы (т. Е. 'Index()' - это может быть просто '@using (Html.BeginForm()) {' –

+0

Q2.- Модель «master» - правильный подход. Вам нужно инициализировать новую экземпляр модели представления в методе GET и передать его в представление, которое будет иметь @model TdlMasterModel –

+0

Спасибо за ответ, я смущен о Q2, не могли бы вы привести пример, пожалуйста ?. Также, если отдельные модели свойство «имя» или что-то подобное, чтобы дифференцировать их в контроллере? Я спрашиваю об этом, потому что некоторые из поля свойств в моделях имеют одно и то же имя, и я беспокоюсь о том, как их отличать при удалении данных из MasterModel. –

ответ

1

Используйте модель представления, содержащие модели для каждой формы, которую вы хотите сделать

View Model

public class MasterVM 
{ 
    public Model1 Model1 { get; set; } 
    public Model2 Model2 { get; set; } 
    .... 
} 

Контроллер

public ActionResult Index() 
{ 
    MasterVM model = new MasterVM(); 
    // Set the values of only those models you want to display forms for 
    model.Model2 = new Model2(); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Index(MasterVM model) 
{ 
    if(!ModelState.IsValid) 
    { 
    return View(); 
    } 
    if (model.Model1 != null) 
    { 
    // save Model1 
    } 
    else if (model.Model2 != null) 
    { 
    // save Model2 
    } 
    .... 
    // redirect somewhere 
} 

Частичное _Model1.cshtml

@model Model1 

@Html.LabelFor(m => m.SomeProperty) 
@Html.TextBoxFor(m => m.SomeProperty) 
@Html.ValidationMessageFor(m => m.SomeProperty) 

@Html.LabelFor(m => m.AnotherProperty) 
@Html.TextBoxFor(m => m.AnotherProperty) 
@Html.ValidationMessageFor(m => m.AnotherProperty) 

.... 

Вид

@model MasterVM 
@using Html.BeginForm()) 
{ 
    if(Model.Model1 != null) 
    { 
    @Html.Partial("_Model1", Model.Model1, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Model1" }}) 
    } 
    if(Model.Model2 != null) 
    { 
    @Html.Partial("_Model2", Model.Model2, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Model2" }}) 
    } 
    .... 
    <input type="submit" /> 
} 

Обратите внимание на третий параметр @Html.Partial.Это добавит префикс имен управления, так что если Model1 содержит свойство string Name, управление будет генерироваться <input name="Model1.Name" ...> позволяет размещать назад и привязать к MasterVM

+0

Спасибо, я пробовал прямо сейчас =) –

+0

Спасибо, это сработало отлично =), большое спасибо, у меня были проблемы, потому что Я не связывал имя правильно «input name =« Model1.Name », еще раз спасибо. –