Разместить форму с несколькими частичными представлениями

В настоящее время я пытаюсь опубликовать форму, состоящую из двух строго типизированных представлений. Этот вопрос похож, но у него нет ответа:

Сообщение формы бритвы MVC 3 с несколькими строго типизированными частичными представлениями, не связывающими

Когда я отправляю форму, модель, представленная контроллеру, всегда равна нулю. Я провел пару часов, пытаясь заставить это работать. Кажется, это должно быть просто. Я что-то здесь упускаю? Мне не нужно делать ajax, просто нужно иметь возможность отправлять сообщения в контроллер и отображать новую страницу.

Спасибо

Вот мой код вида:

<div>
    @using (Html.BeginForm("TransactionReport", "Reports", FormMethod.Post, new {id="report_request"}))
    {
        ViewContext.FormContext.ValidationSummaryId = "valSumId";
        @Html.ValidationSummary(false, "Please fix these error(s) and try again.", new Dictionary<string, object> { { "id", "valSumId" } });
        @Html.Partial("_ReportOptions", Model.ReportOptions);
        @Html.Partial("_TransactionSearchFields", new ViewDataDictionary(viewData) { Model = Model.SearchCriteria });
    }

Вот код в контроллере:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TransactionReport(TransactionReportRequest reportRequest)
{
    var reportInfo = new List<TransactionReportItem>();

    if (ModelState.IsValid)
    {
        var reportData = _reportDataService.GetReportData(Search.MapToDomainSearchCriteria(reportRequest.SearchCriteria));
        if (reportData!=null)
        {
            reportInfo = reportData.ToList();
        }
        return View(reportInfo);
    }
    return View(reportInfo);
}

Сами частичные представления не имеют никакого отношения к делу, так как все, что они делают, это ожидают и показывают свои модели.

5 ответов

Решение

Частичные не способ пойти сюда. Вы ищете EditorTemplates, они созданы для того, что вы хотите. В этом случае ваши свойства будут привязаны к вашей модели (которую вы отправите).

Ваш основной вид будет иметь эту форму (обратите внимание, что вам нужно только использовать EditorFor вместо Partial; в этом случае вам, вероятно, потребуется поместить этот параметр viewData в ViewBag или около того):

@using (Html.BeginForm("TransactionReport", "Reports", FormMethod.Post, new {id="report_request"}))
{
    ViewContext.FormContext.ValidationSummaryId = "valSumId";
    @Html.ValidationSummary(false, "Please fix these error(s) and try again.", new Dictionary<string, object> { { "id", "valSumId" } });
    @Html.EditorFor(model => model.ReportOptions);
    @Html.EditorFor(model = Model.SearchCriteria });
}

Теперь вам нужно только перетащить ваши частичные в папку ~/Shared/EditorTemplates/ и переименуйте их в соответствии с названием модели, для которой они являются шаблонами редактора.

в ~/Shared/EditorTemplates/ папку, создайте новый "просмотр", например "SearchCriteria.cshtml". Внутри укажите в качестве "модели" тип класса, для которого вы хотите создать шаблон редактора. Пример (пример класса имеет свойства Name а также OtherCriteria):

@model MyNamespace.SearchCriteria
<ul>
    <!-- Note that I also use EditorFor for the properties; this way you can "nest" editor templates or create custom editor templates for system types (like DateTime or String or ...). -->
    <li>@Html.LabelFor(m => m.Name): @Html.EditorFor(m => m.Name)</li>
    <li>@Html.LabelFor(m => OtherCriteria): @Html.EditorFor(m => m.OtherCriteria</li>
</ul>

Немного хорошего чтения о них:

Вы должны добавить префикс к полям PartialView. Это позволит правильно связывать данные.

Так что вместо:

@Html.Partial("_ReportOptions", Model.ReportOptions);

Использование:

@Html.Partial("_ReportOptions", Model.ReportOptions, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ReportOptions" }})

Я согласен с @Styxxy и @Tony, шаблоны редактора - лучшее решение. Однако ваша проблема заключается в том, что вы подаете субмодель на частичные виды. Таким образом, когда визуализируется частичное представление, оно не знает, что оно является частью более крупной модели, и не генерирует правильные атрибуты имени.

Если вы настаиваете на использовании Partials, а не шаблонов редактора, тогда я предлагаю только передать модель в partials, а затем каждый частичный объект должен выполнять Model.Whwhat.Foo, и он будет генерировать правильные атрибуты имени для привязки.

Попробуйте использовать EditorTemplates вместо Partials http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/.

@Html.Partial("_ReportOptions", Model.Contact, new ViewDataDictionary()
           {
               TemplateInfo = new TemplateInfo()
                   {
                       HtmlFieldPrefix = "Contact"
                   }
           })

)


@Html.Partial("_TransactionSearchFields", Model.SearchCriteria, new  
 ViewDataDictionary()
           {
               TemplateInfo = new TemplateInfo()
                   {
                       HtmlFieldPrefix = "SearchCriteria"
                   }
           })
Другие вопросы по тегам