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