Begin.Form с перегрузкой, которая принимает параметры routeValues и htmlAttributes
Я использую перегрузку 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"} }
)
Ответы
Ответ 1
Использовать (как RouteValues, так и HtmlAttributes - объекты):
Html.BeginForm("Category", "Home",
new { TestRoute1 = "test" },
FormMethod.Post,
new { id = "frmCategory" }
)
или (оба RouteValues и HtmlAttributes - словари):
Html.BeginForm("Category", "Home",
new RouteValueDictionary { {"TestRoute1", "test"} },
FormMethod.Post,
new Dictionary<string, object> { {"id", "frmCategory"} }
)
Ответ 2
вы можете написать
<% using (Html.BeginForm("Category", "Home", new {TestRoute1=HttpContext.Current.Request.QueryString["TestRoute1"] }, FormMethod.Post, new {id = "MainForm" })) { %>
Ответ 3
using (Html.BeginForm("Category", "Home", new { TestRoute1="test"},
FormMethod.Post, new {id="frmCategory"})) {
отображает
<form action="/accountchecker/Home/Category?TestRoute1=test"
id="frmCategory" method="post">
<input type="submit" value="submit" name="subform" />
</form>