2009-06-24 9 views
16

che uso un sovraccarico di Begin.Form che accetta routeValues ​​Begin.Form con overload che accetta routeValues ​​e 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" /> 
<% }%> 

Questo funziona bello e rende il FormTag come:

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

ho bisogno di cambiamento htmlAttributes, ecco perché ho usato:

<% 
     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" /> 
<% }%> 

Il risultato è completamente sbagliato:

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

Posso vedere nella fonte del Formhelper quale sia la ragione.

Ci sono 2 sovraccarichi che si applicano ai miei determinati parametri:

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) 

Si va male, poiché il primo metodo viene prelevato. Se non fornisco htmlAttributes, non c'è sovraccarico dell'oggetto come parametro e everyrthing funziona come previsto.

Ho bisogno di una soluzione alternativa che accetti un dizionario di RouteValues ​​e htmlAttributes. Vedo che ci sono sovraccarichi che hanno un routeName aggiuntivo, ma non è quello che voglio.

MODIFICA: eugene ha mostrato il corretto utilizzo di BeginForm.

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

)

risposta

29

Usa (entrambi RouteValues ​​e HtmlAttributes sono oggetti):

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

o (entrambi RouteValues ​​e HtmlAttributes sono dizionari) :

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

Grazie Eugene, funziona. Ma deve essere il nuovo dizionario {{"id", "frmCategory"} –

+0

Grazie, corretto :) –

+0

@ eu-ge-ne Puoi controllare la mia domanda, ci sono alcune somiglianze: 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"})) { 

rende a

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

è possibile scrivere

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