c# - example - Objeto complejo y carpeta modelo ASP.NET MVC
list mvc example (4)
Acabo de descubrir otra razón por la que esto puede suceder, que es si su propiedad se llama Settings
. Considere el siguiente modelo de vista:
public class SomeVM
{
public SomeSettings DSettings { get; set; } // named this way it will work
public SomeSettings Settings { get; set; } // property named ''Settings'' won''t bind!
public bool ResetToDefault { get; set; }
}
En el código, si se vincula a la propiedad de Settings
, no se puede vincular (no solo en la publicación, sino incluso al generar el formulario). Si cambia el nombre de Settings
a DSettings
(etc.) de repente funciona de nuevo.
Tengo una estructura de objeto modelo con una clase Foo
que contiene una Bar
con un valor de cadena.
public class Foo
{
public Bar Bar;
}
public class Bar
{
public string Value { get; set; }
}
Y un modelo de vista que usa esa estructura como esta
public class HomeModel
{
public Foo Foo;
}
Luego tengo una forma a la vista que en Razor se ve algo así.
<body>
<div>
@using (Html.BeginForm("Save", "Home", FormMethod.Post))
{
<fieldset>
@Html.TextBoxFor(m => m.Foo.Bar.Value)
<input type="submit" value="Send"/>
</fieldset>
}
</div>
</body>
En html eso se convierte.
<form action="/Home/Save" method="post">
<fieldset>
<input id="Foo_Bar_Value" name="Foo.Bar.Value" type="text" value="Test">
<input type="submit" value="Send">
</fieldset>
</form>
Finalmente, el controlador para manejar los correos como este
[HttpPost]
public ActionResult Save(Foo foo)
{
// Magic happends here
return RedirectToAction("Index");
}
Mi problema es que Bar
in Foo
es null
una vez que golpea la acción del controlador Save
(se crea Foo
pero con un campo Bar
null
).
Pensé que la carpeta de modelo en MVC sería capaz de crear el objeto Foo
y la Bar
y establecer la propiedad Value
siempre que se parezca a la anterior. ¿Qué me estoy perdiendo?
También sé que mi modelo de vista es un poco complicado y podría ser más simple, pero por lo que estoy tratando de hacer, realmente me ayudaría si pudiera usar la estructura de objetos más profunda. Los ejemplos anteriores usan ASP.NET 5.
En primer lugar, DefaultModelBinder
no se vinculará a los campos, por lo que necesita usar propiedades
public class HomeModel
{
public Foo Foo { get; set; }
}
En segundo lugar, los ayudantes están generando controles basados en HomeModel
pero usted está publicando en Foo
. Cambie el método POST a
[HttpPost]
public ActionResult Save(HomeModel model)
o use BindAttribute
para especificar el Prefix
(que esencialmente BindAttribute
el valor del prefijo de los valores publicados, por lo que Foo.Bar.Value
convierte en Bar.Value
a efectos de enlace)
[HttpPost]
public ActionResult Save([Bind(Prefix="Foo")]Foo model)
Tenga en cuenta también que no debe nombrar el parámetro del método con el mismo nombre que una de sus propiedades; de lo contrario, el enlace fallará y su modelo será nulo.
Tuve el mismo problema y después de seguir los pasos de @Stephen Muecke, me di cuenta de que el problema se debía a que mis entradas estaban deshabilitadas (estaba deshabilitándolas con JQuery en el documento listo) como puede ver aquí: ¿Cómo presento la entrada deshabilitada en ASP.NET MVC? . Al final utilicé el atributo de solo lectura en lugar del atributo desactivado y todos los valores se enviaron con éxito al controlador.
Tuve el mismo problema, pero una vez que creé un CAMPO OCULTO para la clave externa ... todo funcionó bien ...
EJEMPLO DE FORMA:
@using (Html.BeginForm("save", "meter", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model => Model.Entity.Id)
@Html.HiddenFor(model => Model.Entity.DifferentialMeter.MeterId)
@Html.HiddenFor(model => Model.Entity.LinearMeter.MeterId)
@Html.HiddenFor(model => Model.Entity.GatheringMeter.MeterId)
... all your awesome controls go here ...
}
EJEMPLO DE ACCIÓN:
// POST: /Meter/Save
[HttpPost]
public ActionResult Save(Meter entity)
{
... world-saving & amazing logic goes here ...
}