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.