Question

Ok, c'est bizarre. Je ne peux pas utiliser BindAttribute's Include et Exclude Propriétés avec des objets imbriqués de type complexe sur ASP.NET MVC.

Voici ce que j'ai fait:

Modèle:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

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

HTTP Post Action:

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

    return View(foo);
}

Voir:

@using (Html.BeginForm()) {

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

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

Ça ne foncrionne pas du tout. Puis-je faire fonctionner cela que si je définis le BindAttribute pour Enquiry classe telle qu'elle est indiquée ici:

Comment utiliser l'attribut [bind (include = "")] sur des objets imbriqués complexes?

Était-ce utile?

La solution

Oui, vous pouvez le faire fonctionner comme ça:

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

Et votre action:

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

Cela ne comprendra que le EnquiryId dans la liaison et laisser le Latitude nul.

Cela étant dit, l'utilisation de l'attribut Bind n'est pas quelque chose que je vous recommande. Ma recommandation est d'utiliser des modèles de vue. À l'intérieur de ces modèles de vue, vous n'incluez que les propriétés qui ont du sens pour cette vue particulière.

Alors réadaptez simplement vos modèles de vue:

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

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

Voilà. Il n'y a plus à s'inquiéter de la liaison.

Autres conseils

À mon humble avis, il y a une meilleure façon de le faire.

Essentiellement, si vous avez plusieurs modèles dans le modèle de vue, la signature du post-contrôleur contiendrait les mêmes modèles, par opposition au modèle de vue.

C'EST À DIRE

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

Et la post-action dans le contrôleur ressemblerait à ceci.

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

Tout ce que la vue ressemble toujours à ça

@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" />
}

Gardez à l'esprit que ce formulaire affichera toujours le retour de latitude (la façon dont vous l'avez configurée), mais comme il n'est pas inclus dans la liaison inclut la chaîne pour enquête sur l'action de la publication, l'action n'acceptera pas la nouvelle valeur dans la résultante Demande. Je suggère de rendre la latitude désactivée ou non un élément de formulaire pour éviter des données de publication supplémentaires.

Dans tout autre scénario, vous pouvez utiliser Bin très bien, mais pour une raison quelconque, il n'aime pas la notation DOT pour les modèles complexes.

En tant que note secondaire, je ne mettrais pas l'attribut de liaison directement sur la classe car il peut entraîner d'autres problèmes comme la réplication du code, et ne tient pas compte de certains scénarios où vous voudrez peut-être avoir une liaison différente.

(J'ai modifié les noms de variables pour plus de clarté. Je suis également conscient que votre question est plutôt datée, mais en recherchant la réponse moi-même, c'est le premier, donc je suis tombé avant d'essayer mes propres solutions et de venir à celui que j'ai posté. J'espère que Cela peut aider d'autres personnes à la recherche d'une solution au même problème.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top