Pregunta

Vale, esto es raro.No puedo usar BindAttribute's Include y Exclude propiedades con objetos anidados de tipo complejo en ASP.NET MVC.

Aquí esta lo que hice:

Modelo:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

Acción de publicación HTTP:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "Enquiry.EnquiryId")]
    FooViewModel foo) {

    return View(foo);
}

Vista:

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.Enquiry.EnquiryId)
    @Html.TextBoxFor(m => m.Enquiry.Latitude)

    <input type="submit" value="push" />
}

No funciona del todo.¿Puedo hacer que esto funcione sólo si defino el BindAttribute para Enquiry clase como se indica aquí:

¿Cómo uso el atributo [Bind(Include="")] en objetos anidados complejos?

¿Fue útil?

Solución

Sí, puedes hacer que funcione así:

[Bind(Include = "EnquiryId")]
public class Enquiry 
{
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

y tu acción:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(FooViewModel foo) 
{
    return View(foo);
}

Esto incluirá sólo el EnquiryId en la encuadernación y dejar el Latitude nulo.

Dicho esto, usar el atributo Bind no es algo que te recomendaría.Mi recomendación es utilizar modelos de vista.Dentro de esos modelos de vista, incluye solo las propiedades que tienen sentido para esta vista en particular.

Simplemente readapte sus modelos de vista:

public class FooViewModel 
{
    public EnquiryViewModel Enquiry { get; set; }
}

public class EnquiryViewModel 
{
    public int EnquiryId { get; set; }
}

Ahí tienes.Ya no tendrás que preocuparte por la encuadernación.

Otros consejos

En mi humilde opinión, hay una mejor manera de hacer esto.

Básicamente, si tiene varios modelos en el modelo de vista, la firma del controlador de la publicación contendría los mismos modelos, a diferencia del modelo de vista.

Es decir,

public class FooViewModel {
    public Bar BarV { get; set; }
    public Enquiry EnquiryV { get; set; }
    public int ThisNumber { get; set; }
}

public class Bar {
    public int BarId { get; set; }
}

public class Enquiry {
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

Y la acción de publicación en el controlador se vería así.

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "EnquiryId")]
    Enquiry EnquiryV,
    [Bind(Include = "BarId"])]
    Bar BarV,
    int ThisNumber
{
    return View(new FooViewModel { Bar = BarV, Enquiry = EnquiryV, ThisNumber = ThisNumber });
}

Todo mientras la vista todavía se ve así

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.EnquiryV.EnquiryId)
    @Html.TextBoxFor(m => m.EnquiryV.Latitude)
    @Html.TextBoxFor(m => m.BarV.BarId)
    @Html.TextBoxFor(m => m.ThisNumber)

    <input type="submit" value="push" />
}

Tenga en cuenta que este formulario seguirá publicando Latitude (de la forma en que lo había configurado); sin embargo, dado que no está incluido en la cadena de vinculación Incluir para la consulta sobre la acción de publicación, la acción no aceptará el nuevo valor. en la Consulta resultante. Sugeriría que la latitud esté inhabilitada o no sea un elemento de formulario para evitar datos de publicación adicionales.

En cualquier otro escenario, puede usar bind bien, pero por alguna razón no le gusta la notación de puntos para modelos complejos.

Como nota al margen, no pondría el atributo bind en la clase directamente, ya que puede causar otros problemas como la replicación de código y no tiene en cuenta ciertos escenarios en los que es posible que desee tener un enlace diferente. p>

(Modifiqué los nombres de las variables para mayor claridad. También soy consciente de que su pregunta es bastante anticuada, sin embargo, al buscar la respuesta yo mismo, este es el primer SO que encontré antes de probar mis propias soluciones y llegar a la que publiqué . Espero que pueda ayudar a otras personas que buscan una solución al mismo problema).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top