net mvc multiple form buttons asp asp.net-mvc asp.net-mvc-3 razor http-post partial-views

asp.net-mvc - multiple - mvc submit button action



Publique un formulario con mĂșltiples vistas parciales (5)

Debe agregar prefijo a los campos de PartialView. Eso permitirá que los datos vinculantes sean correctos.

Así que en vez:

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

Utilizar:

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

Actualmente estoy intentando publicar un formulario compuesto por dos vistas fuertemente tipadas. Esta pregunta es similar pero no tiene una respuesta:

MVC 3 Razor Form Post w / Vistas parciales fuertemente tipadas no vinculantes

Cuando envío el formulario, el modelo enviado al controlador siempre es nulo. He pasado un par de horas tratando de hacer que esto funcione. Esto parece que debería ser simple. ¿Me estoy perdiendo de algo? No necesito hacer ajax solo necesito poder publicar en el controlador y presentar una página nueva.

Gracias

Aquí está mi código de vista:

<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 }); }

Aquí está el código en el controlador:

[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); }

Las vistas parciales en sí mismas son bastante irrelevantes, ya que todo lo que hacen es esperar y mostrar sus modelos.


Estoy de acuerdo con @Styxxy y @Tony, las plantillas de editor son la mejor solución. Sin embargo, su problema es que está alimentando un submodelo a las vistas parciales. Por lo tanto, cuando la vista parcial representa no sabe que es parte de un modelo más grande y no genera los atributos de nombre correctos.

Si insistes en usar Partials en lugar de Plantillas de Editor, entonces sugiero solo pasar el Modelo a los parciales, luego tener cada parcial hacer Model.Whatever.Foo y generará los atributos de nombre correctos para el enlace.


Los parciales no son el camino a seguir aquí. Está buscando EditorTemplates, estos están hechos para lo que quiere. En este caso, sus propiedades estarán muy ligadas a su modelo (que enviará).

Su vista principal tendrá este formulario (tenga en cuenta que solo tiene que usar EditorFor lugar de Partial , en este caso, probablemente necesite poner ese parámetro viewData en el ViewBag o más):

@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 }); }

Ahora solo tiene que arrastrar sus parciales a la carpeta ~/Shared/EditorTemplates/ y cambiarles el nombre para que coincidan con el nombre del modelo para el que son las plantillas de editor.

En la carpeta ~/Shared/EditorTemplates/ , ~/Shared/EditorTemplates/ una nueva "vista", ejemplo "SearchCriteria.cshtml". En el interior, ponga como "modelo" el tipo de clase para la cual creará una plantilla de editor. Ejemplo (la clase de ejemplo tiene propiedades Name y 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>

Algunas buenas lecturas sobre ellos:



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