MVC3 Html.BeginForm - passage d'arguments que RouteValueDictionary échoue
J'ai un multi-étape du processus de configuration des où je voudrais passer des arguments de chaîne de requête ajouté à l'URL seulement si elles sont pertinentes.
http://localhost:6618/Account/Profile?wizard=true&les chats=chiens
@using( Html.BeginForm() )
a très bien fonctionné. Il a donné: <form action="/Account/Profile?setup=true&cats=dogs" method="post">
c'est à dire, il est passé dans le POST d'action un de l'original paramètres de chaîne de requête, et ensuite dans celui de Contrôleur de l'action j'ai pu choisir ceux qui sont pertinents pour passer à l'étape suivante pour moi, ou faut ajouter, en ajoutant à la RouteValues et un RedirectToResult.
Cependant, j'ai besoin d'attribuer une classe de ma forme pour le style de fins.
J'ai essayé:
@using( Html.BeginForm( "Profile", "Account", args, FormMethod.Post, new { @class = "mainForm" } ) )
ce qui donne:
<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
a été généré par un filtre, et est un RouteValueDictionary). La spécification http://msdn.microsoft.com/en-us/library/dd505151.aspx indique que vous pouvez passer des arguments à un Système.Web.Le routage.RouteValueDictionary.
Ce que je veux, c'est <form action="/Account/Profile?setup=true&cats=dogs" class="mainForm" method="post">
Je dois mentionner que je préfère ne pas faire quelque chose comme passer dans new {key = value}
au lieu de cela, car il y a un juste montant de la logique pour déterminer ce que je vais passer à la prochaine étape.
Des suggestions sur les choses à faire ici?
Je suis bloqué par ce qui semble être une tâche simple, et je suis sûrement quelque chose lui manque terriblement évident.
OriginalL'auteur Erica | 2012-01-27
Vous devez vous connecter pour publier un commentaire.
C'est le point clé ici. Dans ce cas, assurez-vous d'utiliser le corriger la surcharge de la BeginForm méthode:
Avis le dernier argument? Il doit être un
IDictionary<string, object>
pour que cela fonctionne.Dans votre exemple, il est cette surcharge qui est ramassé. Mais puisque vous êtes de passage à un
RouteValueDictionary
pour la routeValues paramètre à la place d'un objet anonyme il obtient foiré.Donc, vous devez avoir à la fois routeValues et htmlAttributes comme les dictionnaires ou les deux, comme des objets anonymes.
Votre solution a fonctionné pour ma situation, mais je ne comprends pas pourquoi le signe @ est utilisé avant que la variable de classe. Quelqu'un peut-il expliquer ce qui se passe ici? Je vous remercie.
il est utilisé parce que
class
est un mot clé réservé en C#. Vous pouvez en lire plus à ce sujet dans la spécification C#: msdn.microsoft.com/en-us/library/aa664670.aspxOriginalL'auteur Darin Dimitrov
Ci fonctionne.
la route de la valeur est créée par l'objet initialiser la syntaxe j'.e nouveau {clé = valeur}
OriginalL'auteur Usama Khalil
De sorte que vous êtes en utilisant cette surcharge:
http://msdn.microsoft.com/en-us/library/dd460542.aspx
Est-il possible de faire args un objet simple avec des clés et des valeurs? Je pense que cela pourrait résoudre votre problème.
Selon docs:
Les paramètres sont récupérés par le biais d'une réflexion en examinant les propriétés de l'objet. Cet objet est généralement créé à l'aide de initialiseur d'objet de syntaxe. - ce qui semble être ce qui se passe-- c'est à l'aide de réflexions pour obtenir les propriétés de la route du dictionnaire - les propriétés clés (collection de la chaîne) et les valeurs (collection d'objets)
Une autre option serait de ne pas utiliser le helper html et de créer la balise de formulaire manuellement-- bien que ce serait le genre de défaites le but d'avoir le code html helpers.
Je ne suis pas sûr de ce qu'un personnalisé HtmlHelper vous achète ici, la logique est d'aller quelque part.
OriginalL'auteur ek_ny
Juste une pensée, mais, même pour un formulaire à étapes multiples, ne serait pas vous voulez choisir de les rendre tous GET ou POST? Dans l'exemple ci-dessus... on dirait que vous êtes à l'aide de POST avec la forme... mais toujours en essayant d'utiliser GET le long du chemin.
Pourquoi ne pas simplement utiliser caché valeurs POST (à l'aide de HTML Entrées, le long de la voie?
Sinon, les utilisateurs peuvent plus facilement changer les valeurs, droit? (Quoique, ce n'est pas pour déplaire à cette application. Et c'est principalement de la nourriture pour la pensée.)
OriginalL'auteur summea