Übergeben von Daten von Controller zu einem Benutzer Control-Ansicht mit ASP.NET MVC

StackOverflow https://stackoverflow.com/questions/403509

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe eine View-Klasse (OrderView.aspx), die die Einzelheiten einer Bestellung (Kontoname, Bestelldatum) sowie eine Liste der Auftragszeilen über das Repeater-Steuerelement zeigt. Jede Bestellung Linie wird von einer User Control Ansicht (OrderLineView.ascx) dargestellt, die die Einzelheiten der Auftragszeile zeigt (Artikelname, Menge, Preis). Ich habe ein Objektmodell namens Order, die ich als Datenquelle für alle diese, die ich als Modellobjekt übergeben für die Ansicht.

Jede OrderLineView Benutzersteuerung hat einen Speicher und Löschen. Ich habe auf die Schaltfläche Speichern, um die Inhalte eines Formulars innerhalb der Orderline Steuerung zu einem Save-Methode auf dem Controller-Posting und dann RedirectToAction wieder auf die gleiche Bestellseite (das erfrischt die ganze Seite, nichts AJAXy darüber). Ich habe die Entf-Taste auf dem Controller auf ein Verfahren, das die Verknüpfung zu löschen versucht und dann RedirectToAction wieder auf die gleiche Bestellseite. Wenn das Löschen fehlschlägt, mag ich jedoch eine wenig Fehlermeldung neben der Löschtaste zeigen, wenn die Seite macht wieder (denken Sie daran, eine Löschtaste ist für jede Auftragszeile auf der Seite, so möchte ich nur die Nachricht neben diejenige, die ich angeklickt). Meine Fragen:

1 - Wie kann ich diese Daten von meiner Controller-Methode, um den spezifischen Benutzer Control übergeben? Soll ich es irgendwie fügen Sie in dem Modell? Es scheint wie eine schlechte Idee (da es wirklich nicht Teil des Modells ist).

2 - Soll ich einen OrderLineController für die Orderline-Operationen haben sowie eine OrderController für Bestellvorgänge? Ich will nur wissen, ob Best Practice über einen separaten Controller für jede Ansicht haben.

3 - Ich habe gesehen, wie einige Leute RedirectToAction mit einem anonymen Typ Wert wie folgt nennen könnte:

RedirectToAction("ViewOrder", new { Id = 1234, Message = "blabla"});

, aber das macht die Nachricht Wert in der URL-Zeichenfolge angezeigt. Ich bin OK mit dem, aber würde es vorziehen, dass es nicht, wenn sie zeigt, möglich.

4 - Auch für Eigenschaften des Modells aus der Ansicht zugreifen, finde ich mich dieses ganze Zeit tun:

foo(((someModelType) this.ViewData.Model).SomeProperty);

Ich mag das nicht für eine Reihe von Gründen, einer davon ist die Tatsache, dass ich will nicht meine Ansicht mit der Art meines Modells gekoppelt werden (weshalb ich View statt View bin mit) . Ich würde viel zu können, bevorzugen einen Anruf wie diese haben:

foo(ModelEval("SomeProperty"));

Gibt es so etwas? Ich habe meine eigenen geschrieben, aber wäre es, wenn ich nicht haben.

War es hilfreich?

Lösung

1

Überprüfen Sie heraus Model.

ViewData.ModelState.AddModelError("something.Name", "Please enter a valid Name");

Model ist eigentlich ein Wörterbuch, so dass Sie die Fehler auf einer Pro-Steuerungsbasis identifizieren können. Ich weiß nicht, ob dies eine bewährte Methode ist, aber es würde wahrscheinlich funktionieren. Versuchen Sie, etwas entlang der Linien von

ViewData.ModelState.AddModelError("something#3.Name", "Please enter a valid Name");

und Ihrer Ansicht nach könnten Sie setzen

<%= Html.ValidationMessage(string.format({"something{0}.Name", YourUniqueId))%>

4

Sie können Ihre Sicht stark ein, so dass Sie nicht, dass die Besetzung brauchen, aber wenn Sie fest Kopplung betroffen sind, kann dies abschrecken. Aber den starken Typ gibt es nicht mehr eng gekoppelt als einen magischen String Punkt zu dieser Eigenschaft des Modells sowieso. Die ehemalige gerade gibt Sie geben Sicherheit und die Herrlichkeit, die Intellisense ist.

Andere Tipps

Da Ihr Orderline hat eine eindeutige Kennung, dass ein Schlüssel zu konstruieren, können in der Model Fehler Behälter gegeben werden.

public ActionResult Delete(int? Id)
{
    ModelState.AddModelError("OrderLine" + Id.Value, "Error deleting OrderLine# " + Id.Value);

    ...    
}

und verwenden Sie dann den ValidatinoMessage Helfer. Dies wird das Model überprüfen, um zu sehen, ob ein Fehler vorliegt und wenn es tut, wird er die Nachricht angezeigt werden soll. Ansonsten ist es leer.

<%= Html.ValidationMessage ("OrderLine" + Id)%>

In der nächsten Version von MVC Modell wird eine Top-Level-Eigenschaft werden, so dass die folgenden

foo(((someModelType) this.ViewData.Model).SomeProperty);

kann geschrieben werden

foo(Model.SomeProperty);

Modellobjekte bereits eingegeben werden sollten, es sei denn Sie verwenden public object als Eigenschaft?

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