asp.net-mvc - beginform mvc 5
Begin.Form con sobrecarga que acepta routeValues y htmlAttributes (3)
Uso (tanto RouteValues como HtmlAttributes son objetos):
Html.BeginForm("Category", "Home",
new { TestRoute1 = "test" },
FormMethod.Post,
new { id = "frmCategory" }
)
o (tanto RouteValues como HtmlAttributes son diccionarios):
Html.BeginForm("Category", "Home",
new RouteValueDictionary { {"TestRoute1", "test"} },
FormMethod.Post,
new Dictionary<string, object> { {"id", "frmCategory"} }
)
Uso una sobrecarga de Begin.Form que acepta routeValues
<%
RouteValueDictionary routeValues = ViewContext.RouteData.Values;
routeValues.Add("TestRoute1", "test");
using (Html.BeginForm(
"Category",
"Home",
routeValues,
FormMethod.Post
))
{ %>
<input type="submit" value="submit" name="subform" />
<% }%>
Esto funciona bien y hace que el formtag como:
<form method="post" action="/Home/Category?TestRoute1=test">
Necesito cambiar los atributos html, por eso utilicé:
<%
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" />
<% }%>
El resultado es completamente incorrecto:
<form method="post" id="frmTyreBySizeCar" action="/de/TyreSize.mvc/List?Count=12&Keys=System.Collections.Generic.Dictionary%....
Puedo ver en la fuente del Formhelper cuál es la razón.
Hay 2 sobrecargas que se aplican a mis parámetros dados:
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)
Va mal, porque el primer método es recogido. Si no proporciono atributos html, entonces no hay una sobrecarga con el objeto como parámetro y todo funciona como se espera.
Necesito una solución que acepte un Diccionario de RouteValues y htmlAttributes. Veo que hay sobrecargas que tienen un nombre de ruta adicional, pero eso no es lo que quiero.
EDIT: eugene mostró el uso correcto de BeginForm.
Html.BeginForm("Category", "Home",
new RouteValueDictionary { {"TestRoute1", "test"} },
FormMethod.Post,
new Dictionary<string, object> { {"id", "frmCategory"} }
)
puedes escribir
<% using (Html.BeginForm("Category", "Home", new {TestRoute1=HttpContext.Current.Request.QueryString["TestRoute1"] }, FormMethod.Post, new {id = "MainForm" })) { %>
using (Html.BeginForm("Category", "Home", new { TestRoute1="test"},
FormMethod.Post, new {id="frmCategory"})) {
rinde a
<form action="/accountchecker/Home/Category?TestRoute1=test"
id="frmCategory" method="post">
<input type="submit" value="submit" name="subform" />
</form>