vistas vista ventana una tipada parciales parcial pagina net mvc multiples modelos modal misma llamar fuertemente desde asp c# asp.net-mvc-3 razor

c# - ventana - vistas parciales asp net mvc 5



Modelos complejos y vistas parciales: problema de vinculaciĆ³n del modelo en ASP.NET MVC 3 (2)

En lugar de:

@Html.Partial("_SimplePartial", Model.Simple)

Te recomendaría usar plantillas de Editor:

@model ComplexModel @using (Html.BeginForm()) { @Html.EditorFor(x => x.Simple) <input type="submit" value="Save" /> }

y luego coloque el parcial simple dentro de ~/Views/Shared/EditorTemplates/SimpleModel.cshtml o dentro de ~/Views/Home/EditorTemplates/SimpleModel.cshtml donde Home es el nombre de su controlador:

@model SimpleModel @Html.LabelFor(model => model.Status) @Html.EditorFor(model => model.Status)

Por supuesto, si prefiere tener el parcial en algún lugar especial y no seguir las convenciones (¿por qué lo haría?), Podría especificar la ubicación:

@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml")

entonces todo entrará en su lugar como se espera.

Tengo 2 modelos en mi aplicación MVC 3 de muestra, SimpleModel y ComplexModel , que se muestran a continuación:

public class SimpleModel { public string Status { get; set; } } public class ComplexModel { public ComplexModel() { Simple = new SimpleModel(); } public SimpleModel Simple{ get; set; } }

Tengo vistas definidas para estos modelos:

_SimplePartial.cshtml :

@model SimpleModel @Html.LabelFor(model => model.Status) @Html.EditorFor(model => model.Status)

y Complex.cshtml :

@model ComplexModel @using (Html.BeginForm()) { @Html.Partial("_SimplePartial", Model.Simple) <input type="submit" value="Save" /> }

Después de enviar el formulario, con un valor aleatorio ingresado en el campo Status , el valor no está vinculado a mi modelo. El campo de Status es NULL cuando estoy comprobando el modelo en mi acción de controlador:

[HttpPost] public ActionResult Complex(ComplexModel model) { // model.Simple.Status is NULL, why ? }

¿Por qué no está encuadernado? No quiero heredar modelos ¿Debo escribir mis carpetas modelo personalizadas para un caso tan simple?

Saludos.


Como Daniel Hall sugiere en su blog , pase un ViewDataDictionary con TemplateInfo donde HtmlFieldPrefix se establece con el nombre de la propiedad SimpleModel:

@Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Simple" } })