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