Я использую перегрузку Begin.Form, которая принимает 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" />
<% }%>
Это работает хорошо и отображает formtag как:
<form method="post" action="/Home/Category?TestRoute1=test">
Мне нужно изменить htmlAttributes, вот почему я использовал:
<%
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" />
<% }%>
Результат полностью неправильный:
<form method="post" id="frmTyreBySizeCar" action="/de/TyreSize.mvc/List?Count=12&Keys=System.Collections.Generic.Dictionary%....
Я могу видеть в источнике Formhelper, в чем причина.
Есть 2 перегрузки, которые применяются к моим заданным параметрам:
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)
Это идет не так, потому что первый метод подбирается. Если я не поставлю htmlAttributes, тогда нет перегрузки с объектом в качестве параметра, и все работает как ожидалось.
Мне нужно обходное решение, которое принимает словарь RouteValues и htmlAttributes. Я вижу, что есть перегрузки с дополнительным именем routeName, но это не то, что я хочу.
EDIT: Евгений показал правильное использование BeginForm.
Html.BeginForm("Category", "Home",
new RouteValueDictionary { {"TestRoute1", "test"} },
FormMethod.Post,
new Dictionary<string, object> { {"id", "frmCategory"} }
)