Wie an den Controller zu übergeben, ohne eine Form eines unpersisted geändertes Objekt aus Sicht zurück?

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

  •  08-07-2019
  •  | 
  •  

Frage

Kurz: , wie Pass-Objekte aus Sicht hat modelbinding zum Controller

Long:
Zuerst auf der Grundlage der vom Benutzer durch eine Suchformular angegebenen Parameter werden einige Objekte aus der Datenbank abgerufen werden. Diese Aufgaben werden Meta-Daten gegeben, die sichtbar sind (aber nicht definieren) an den Kunden. (Zum Beispiel: Benennung und Preisgestaltung der Objekte unterscheiden sich von Region zu Region)
Später in der Website, kann der Benutzer auf Links klicken, die Details dieser Objekte zeigen. Da diese Meta-Daten wichtig sind für die Anzeige, aber nicht definieren, muss ich in der Steuerung, die vorher geändert Objekt zurück. Wenn das Standard-I asp.net MVC modelbinding verwendet, wird die .ToString () Methode verwendet. Dieser vom Kurs gibt keinen entsprechenden Zeichenfolge für das komplette Objekt neu zu erstellen.
Ich würde die ISerializable Schnittstelle beteiligt wäre dargestellt haben, aber das ist nicht so. Wie soll ich mich über die gewünschte Wirkung zu erzielen? Ich kann mir nicht vorstellen Ich bin der erste, der sich mit dieser Frage konfrontiert werden, so dass ich denke, ich bin etwas fehlt irgendwo ...

War es hilfreich?

Lösung

Das Standardmodell Bindung nimmt Form Parameter mit ihrem Namen und gleicht sie mit den Eigenschaften des in der Argumentliste spezifiziert. Zum Beispiel Ihr Modell hat Eigenschaften „Preis“ und „Name“, dann wäre die Form müssen Eingänge mit ids / Namen „Preis“ enthalten und „Name“ (Ich vermute, es hat einen Fall unempfindlich Spiel). Das Bindemittel verwendet Reflektion die Formularwerte mit diesen Schlüssel in den entsprechenden Typ zugeordnet zu konvertieren und weist es die Eigenschaften eines neu erstellte Objekt des Typs durch den Parameter spezifiziert (wieder durch Reflexion abgeleitet).

Sie können tatsächlich sehen (und Download) Quelle für diese unter http://www.codeplex.com / aspnet , obwohl man von dort in die MVC-Quelle nach unten bohren müssen würde. Ich würde einen Link auf die Default Quelle geben, aber die Art, wie sie aufgebaut sind, glaube ich, die Link Änderungen als Revisionen eingeführt werden.

Also, Ihre Frage zu beantworten, müssen Sie Parameter haben (versteckt werden könnte) auf dem Formular, die auf die Eigenschaften des Objekts entsprechen, die Sie neu erstellen möchten. Wenn man die Form (in der Ansicht) Eintrag der Steuerung sollte das Bindemittel ein Objekt des angegebenen Typs mit den Formularparameter rekonstituieren. Wenn Sie eine Übersetzung aus den Werten in der Form Parameter zu den Objekteigenschaften tun müssen, werden Sie wahrscheinlich benötigen, um Ihre eigenen benutzerdefinierten Modell Binder zu implementieren.

[EDIT] Als Antwort auf Ihren zweiten Beitrag:

Lassen Sie uns sagen, dass wir einen Link zu einer Aktion haben wollen, die ein individuelles Objekt verwendet. Wir können speichern das angepasste Objekt in TempData (oder die Session, wenn wir sie brauchen mehr durch mehr als eine Postbacks zum letzten) mit einem bestimmten Schlüssel. Wir können dann die Aktion Verbindung aufzubauen und den Schlüssel des Objekts als Wert an die Action in einer anonymen Klasse bieten. Dadurch wird der Schlüssel als Anfrage-Parameter übergeben zurück. In unserer Aktion können wir den Schlüssel aus diesem Parameter verwenden, um das Objekt von TempData abgerufen werden.

<%= Html.ActionLink( ViewData["CustomObject1",
                     "Select",
                     new { TempDataKey = ViewData["CustomObject1_Key"] }
                   ) %>
&nbsp;

public ActionResult Select()
{
    Entity custObj = null;
    string objKey = Request.Params["TempDataKey"];
    if (!string.IsNullOrEmpty(objKey))
    {
       custObj = (Entity)TempData[objKey];
    }

    ... continue processing
}

Andere Tipps

@tvanfosson

Vielen Dank für Ihre Erklärung, aber was ist Link? (Keine Formulare beteiligt) Derzeit ist die Html.ActionLink (c => c.Action (Parameter), "label") nimmt Objekte als Parameter. Diese müssen übersetzt werden in URL Teile. Dazu geht MVC IMMER auf die .ToString () -Methode. Ich will nicht meine Aufgabe in der ToString-Methode serialisiert.
Sollte ich irgendwie nicht in der Lage sein, den Rahmen mein Objekt serialisiert zu helfen? Sprich durch die ISerialize Schnittstelle oder etwas?

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