Кто-либо может объяснить, почему следующее происходит? И как решить, Visual Studio 2010 и MVC2
<%= Html.ActionLink("Add New Option", "AddOption", "Product", new { @class = "lighbox" }, null)%>
Результаты в
/Product/AddOption? class=lightbox
<%= Html.ActionLink("Add New Option", "AddOption", "Product", new { @class = "lighbox" })%>
Результаты в
/Product/AddOption? Length=7
Спасибо
Вы используете эти соответствующие перегрузки:
public static MvcHtmlString ActionLink(
this HtmlHelper htmlHelper,
string linkText,
string actionName,
string controllerName,
Object routeValues,
Object htmlAttributes
)
From: http://msdn.microsoft.com/en-us/library/dd504972.aspx
public static MvcHtmlString ActionLink(
this HtmlHelper htmlHelper,
string linkText,
string actionName,
Object routeValues,
Object htmlAttributes
)
From: http://msdn.microsoft.com/en-us/library/dd492124.aspx
Первый new { @class = "lighbox" }
передается как аргумент routeValues
, когда он должен быть аргументом htmlAttributes
.
Подобная проблема характерна для методов расширения, используемых в MVC. Иногда помогает использование именованных аргументов (C# 4.0), чтобы сделать вещи более читабельными:
<%= Html.ActionLink(linkText: "Add New Option",
actionName: "AddOption",
controllerName: "Product",
htmlAttributes: new { @class = "lighbox" },
routeValues: null)%>
Это пример «ада перегрузки» в ASP.NET MVC.
Первый код вызывает следующий метод:
public static MvcHtmlString ActionLink(
this HtmlHelper htmlHelper,
string linkText,
string actionName,
string controllerName,
Object routeValues,
Object htmlAttributes
)
, тогда как второй код вызывает этот:
public static MvcHtmlString ActionLink(
this HtmlHelper htmlHelper,
string linkText,
string actionName,
Object routeValues,
Object htmlAttributes
)
Обратите внимание, что строковый параметр controllerName
в первом вызове становится routeValues
во втором. Строковое значение «Product» передается маршрутизируемым значениям: используется строковое свойство Length
, длина которого здесь равна 7, следовательно, «Length = 7» вы получаете в маршруте.
При рассмотрении первого метода кажется, что вы поменяли местами параметры routeValues
и htmlAttributes
.