Я использую перегрузку 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" />
<% }%>
Это хорошо работает и отображает тег:
<form method="post" action="/Home/Category?TestRoute1=test">
Мне нужно изменить атрибуты html, поэтому я использовал:
<%
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%....
Я вижу в источнике Формхелпера причину.
Есть 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. Я вижу, что есть перегрузки, которые имеют дополнительное имя-маршрута, но это не то, что я хочу.
РЕДАКТИРОВАТЬ: Евгений показал правильное использование BeginForm.
Html.BeginForm("Category", "Home",
new RouteValueDictionary { {"TestRoute1", "test"} },
FormMethod.Post,
new Dictionary<string, object> { {"id", "frmCategory"} }
)