Опубликовать форму с несколькими частичными видами
В настоящее время я пытаюсь опубликовать форму, состоящую из двух строго типизированных представлений. Этот вопрос схож, но ответа у него нет:
MVC 3 Razor Form Post с несколькими строго типизированными частичными представлениями, не связанными
Когда я отправляю форму, модель, представленная контроллеру, всегда равна нулю. Я потратил пару часов, пытаясь заставить это работать. Кажется, это должно быть просто. Я что-то упустил? Мне не нужно делать 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);
}
Частичные представления сами по себе довольно неактуальны, поскольку все, что они делают, - это ожидание и отображение своих моделей.
Ответы
Ответ 1
Частицы - это не путь сюда. Вы ищете 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>
Некоторое хорошее чтение о них:
Ответ 2
Я согласен с @Styxxy и @Tony, Редактор Шаблоны - лучшее решение. Тем не менее, ваша проблема заключается в том, что вы кормите подмодуль к частичным представлениям. Таким образом, при частичном представлении он не знает, что он является частью более крупной модели и не генерирует правильные атрибуты имени.
Если вы настаиваете на использовании Partials, а не на шаблонах редакторов, то я предлагаю только передать модель частичным файлам, а затем выполнить частичное выполнение Model.Whatever.Foo и создать правильные атрибуты имени для привязки.
Ответ 3
Вы должны добавить префикс в поля PartialView. Это позволит корректно связывать данные.
Итак, вместо этого:
@Html.Partial("_ReportOptions", Model.ReportOptions);
Использование:
@Html.Partial("_ReportOptions", Model.ReportOptions, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ReportOptions" }})
Ответ 4
Попробуйте использовать EditorTemplates вместо Partials http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/.
Ответ 5
@Html.Partial("_ReportOptions", Model.Contact, new ViewDataDictionary()
{
TemplateInfo = new TemplateInfo()
{
HtmlFieldPrefix = "Contact"
}
})
)
@Html.Partial("_TransactionSearchFields", Model.SearchCriteria, new
ViewDataDictionary()
{
TemplateInfo = new TemplateInfo()
{
HtmlFieldPrefix = "SearchCriteria"
}
})