2009-06-24 5 views
16

j'utilise une surcharge de Begin.Form qui accepte routeValues ​​Begin.Form avec surcharge qui accepte routeValues ​​et htmlAttributes

<% 
     RouteValueDictionary routeValues = ViewContext.RouteData.Values; 
     routeValues.Add("TestRoute1", "test"); 

     using (Html.BeginForm(
      "Category", 
      "Home", 
       routeValues, 
       FormMethod.Post 

    )) 
     { %> 

     <input type="submit" value="submit" name="subform" /> 
<% }%> 

Cela fonctionne bien et rend le formtag comme:

<form method="post" action="/Home/Category?TestRoute1=test"> 

Je dois changement htmlAttributes, c'est pourquoi je:

<% 
     RouteValueDictionary routeValues = ViewContext.RouteData.Values; 
     routeValues.Add("TestRoute1", "test"); 

     using (Html.BeginForm(
      "Category", 
      "Home", 
       routeValues, 
       FormMethod.Post, 
       new {id="frmCategory"} 

    )) 
     { %> 

     <input type="submit" value="submit" name="subform" /> 
<% }%> 

Le résultat est complètement faux:

<form method="post" id="frmTyreBySizeCar" action="/de/TyreSize.mvc/List?Count=12&amp;Keys=System.Collections.Generic.Dictionary%.... 

Je peux voir dans la source du Formhelper quelle est la raison.

Il y a 2 qui s'appliquent à des surcharges mes paramètres donnés:

public static MvcForm BeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues, FormMethod method, object htmlAttributes) 

public static MvcForm BeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, FormMethod method, IDictionary<string, object> htmlAttributes) 

Il va mal, parce que la première méthode est ramassé. Si je ne fournis pas htmlAttributes, il n'y a pas de surcharge avec objet en paramètre et tout fonctionne comme prévu.

J'ai besoin d'une solution de contournement qui accepte un dictionnaire de RouteValues ​​et htmlAttributes. Je vois qu'il y a des surcharges qui ont un nom de route supplémentaire, mais ce n'est pas ce que je veux.

EDIT: eugene a montré le bon usage de BeginForm.

Html.BeginForm("Category", "Home", 
new RouteValueDictionary { {"TestRoute1", "test"} }, 
FormMethod.Post, 
new Dictionary<string, object> { {"id", "frmCategory"} } 

)

Répondre

29

utilisation (les deux RouteValues ​​et htmlAttributes sont des objets):

Html.BeginForm("Category", "Home", 
    new { TestRoute1 = "test" }, 
    FormMethod.Post, 
    new { id = "frmCategory" } 
) 

ou (les deux RouteValues ​​et htmlAttributes sont des dictionnaires) :

Html.BeginForm("Category", "Home", 
    new RouteValueDictionary { {"TestRoute1", "test"} }, 
    FormMethod.Post, 
    new Dictionary<string, object> { {"id", "frmCategory"} } 
) 
+1

Merci EUGENE, cela fonctionne. Mais doit être nouveau Dictionnaire {{"id", "frmCategory"} –

+0

Merci, fixe :) –

+0

@ eu-ge-ne Pouvez-vous vérifier ma question, il y a quelques similitudes: http: // stackoverflow.com/questions/12142356/send-an-object-as-a-parameter-to-post-action-in-asp-net-mvc3 – Saeid

1
using (Html.BeginForm("Category", "Home", new { TestRoute1="test"}, 
     FormMethod.Post, new {id="frmCategory"})) { 

rend à

<form action="/accountchecker/Home/Category?TestRoute1=test" 
    id="frmCategory" method="post"> 
    <input type="submit" value="submit" name="subform" /> 
</form> 
2

vous pouvez écrire

<% using (Html.BeginForm("Category", "Home", new {TestRoute1=HttpContext.Current.Request.QueryString["TestRoute1"] }, FormMethod.Post, new {id = "MainForm" })) { %> 
Questions connexes