Frage

OK, das ist komisch.Ich kann nicht verwenden BindAttributevon Include und Exclude eigenschaften mit komplexen Typ verschachtelten Objekten auf ASP.NET MVC.

Hier ist was ich getan habe:

Modell:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

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

HTTP-POST-Aktion:

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

    return View(foo);
}

Blick:

@using (Html.BeginForm()) {

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

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

Funktioniert überhaupt nicht.Kann ich das nur schaffen, wenn ich das definiere BindAttribute für Enquiry klasse, wie es hier angegeben ist:

Wie verwende ich das Attribut [Bind (Include = "")] für komplexe verschachtelte Objekte?

War es hilfreich?

Lösung

Ja, Sie können es so funktionieren lassen:

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

und deine Aktion:

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

Dies umfasst nur die EnquiryId in der Bindung und lassen Sie die Latitude null.

Davon abgesehen würde ich Ihnen die Verwendung des Bind Attributs nicht empfehlen.Meine Empfehlung ist die Verwendung von Ansichtsmodellen.In diese Ansichtsmodelle fügen Sie nur die Eigenschaften ein, die für diese bestimmte Ansicht sinnvoll sind.

Passen Sie also einfach Ihre Ansichtsmodelle neu an:

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

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

Bitte schön.Sie müssen sich keine Gedanken mehr über die Bindung machen.

Andere Tipps

IMHO gibt es einen besseren Weg, dies zu tun.

Wenn Sie mehrere Modelle im Ansichtsmodell haben, würde die Signatur des Post-Controllers im Gegensatz zum Ansichtsmodell im Wesentlichen dieselben Modelle enthalten.

Z.B.

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

Und die Post-Aktion im Controller würde so aussehen.

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

Solange die Aussicht noch so aussieht

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

Denken Sie daran, dass dieses Formular weiterhin den Breitengrad zurückgibt (so wie Sie es eingerichtet haben). Da es jedoch nicht in der Bind-Include-Zeichenfolge für die Anfrage zur Post-Aktion enthalten ist, akzeptiert die Aktion den neuen Wert in der nicht resultierende Anfrage.Ich würde vorschlagen, Latitude entweder deaktiviert oder nicht als Formularelement festzulegen, um zusätzliche Buchungsdaten zu verhindern.

In jedem anderen Szenario können Sie bind problemlos verwenden, aber aus irgendeinem Grund mag es die Punktnotation für komplexe Modelle nicht.

Als Randnotiz würde ich das Bindungsattribut nicht direkt in die Klasse einfügen, da dies andere Probleme wie die Codereplikation verursachen kann und bestimmte Szenarien, in denen Sie möglicherweise eine andere Bindung wünschen, nicht berücksichtigt.

(Ich habe die Variablennamen aus Gründen der Übersichtlichkeit geändert.Mir ist auch bewusst, dass Ihre Frage ziemlich veraltet ist, aber bei der Suche nach der Antwort selbst ist dies die erste, auf die ich gestoßen bin, bevor ich meine eigenen Lösungen ausprobiert und zu der von mir geposteten gekommen bin.Ich hoffe, es kann anderen Menschen helfen, die nach einer Lösung für das gleiche Problem suchen.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top