MVC3, Html.BeginForm - übergeben von Argumenten als RouteValueDictionary ausfällt
Ich habe einen multi-Schritt-setup-Prozess, wo ich gerne weitergeben möchte query-string-Argumente, die an die URL angehängt und nur, wenn Sie relevant sind.
http://localhost:6618/Account/Profile?wizard=true&Katzen=Hunde
@using( Html.BeginForm() )
Super geklappt. Es ergab sich: <form action="/Account/Profile?setup=true&cats=dogs" method="post">
also ging Sie in die POST-Aktion die ursprünglichen query-string-Parameter, und dann in die Controller-Aktion, die ich entscheiden konnte, welche relevante pass auf meinen nächsten Schritt, oder muss hinzufügen, indem Sie auf die RouteValues und ein RedirectToResult.
Allerdings brauche ich zum zuweisen einer Klasse, um meine form für styling Zwecke.
Habe ich versucht:
@using( Html.BeginForm( "Profile", "Account", args, FormMethod.Post, new { @class = "mainForm" } ) )
welche ergibt:
<form action="/Account/Profile?Count=1&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D" class="mainForm" method="post">
(args
wurde erzeugt, indem ein filter, und ist ein RouteValueDictionary). Die Spezifikation http://msdn.microsoft.com/en-us/library/dd505151.aspx zeigt, dass man Argumente übergeben, die mit einem System.Web.Routing.RouteValueDictionary.
Was ich will, ist <form action="/Account/Profile?setup=true&cats=dogs" class="mainForm" method="post">
Sollte ich erwähnen, ich würde es vorziehen, nicht zu tun, so etwas wie die übergabe in new {key = value}
statt, da gibt es eine ganze Menge Logik, um zu bestimmen, was ich sein werde vorbei entlang zum nächsten Schritt.
Irgendwelche Vorschläge, was hier zu tun ist?
Ich bin gehemmt, durch diese scheinbar einfache Aufgabe ist, und bin sicher, etwas zu verpassen, schrecklich offensichtlich.
- Vielleicht die Antwort in diesem anderen Beitrag konnte dir ein wenig helfen? stackoverflow.com/questions/1219223/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist der entscheidende Punkt hier. In diesem Fall stellen Sie sicher, dass Sie die richtigen overload der BeginForm Methode:
Bemerken das Letzte argument? Es muss ein
IDictionary<string, object>
für diese zu arbeiten.In deinem Beispiel ist es diese überlastung, die wird abgeholt. Aber da Sie auf der Durchreise sind eine
RouteValueDictionary
für die routeValues parameter anstelle eines anonymen Objekts Durcheinander gebracht.So, Sie sollten entweder beide routeValues und htmlAttributes wie Wörterbücher oder sowohl als anonyme Objekte.
class
ist ein reserviertes Schlüsselwort in C#. Sie können mehr darüber Lesen Sie in der C# - Spezifikation: msdn.microsoft.com/en-us/library/aa664670.aspxFolgenden arbeiten.
die route der nutzen ist, den Objekt initialisieren syntax, die ich.e {Schlüssel = Wert}
Also bist du mit dieser überladung:
http://msdn.microsoft.com/en-us/library/dd460542.aspx
Ist es möglich, args ein einfaches Objekt mit den Schlüsseln und Werten? Ich denke, dass könnte dein problem lösen.
Laut docs:
Die Parameter abgerufen werden, durch Reflexion, durch untersuchen der Eigenschaften des Objekts. Dieses Objekt wird normalerweise erstellt, indem die Objekt-Initialisierer-syntax. - dies scheint das zu sein, was ist passiert-- ist es mit Reflexionen, um die Eigenschaften von route-dictionary - den Eigenschaften, die Tasten (Sammlung von string) und Werte (Sammlung von Objekten)
Eine andere Möglichkeit wäre, nicht die Nutzung der html-Hilfe und erstellen Sie ein Formular-tag manuell-obwohl, dass würde Art der Niederlage der Zweck des html-helpers.
Nur ein Gedanke, aber auch für ein multi-Schritt-form, würden Sie nicht wollen, wählen Sie entweder machen es alle GET-oder POST? In dem Beispiel oben... es sieht aus wie Sie mit POST, mit der form... aber immer noch versuchen zu nutzen, ERHALTEN auf dem Weg.
Warum nicht einfach ausgeblendet POST-Werte (mit HTML-Eingängen) auf dem Weg?
Sonst könnten Benutzer mehr-einfach die Werte ändern, richtig? (Obwohl, das könnte keine Rolle spielen in dieser Anwendung. Und dies ist meist nur Denkanstöße.)