Asp.Net MVC ActionLink - PullRequest
       25

Asp.Net MVC ActionLink

10 голосов
/ 24 мая 2010

Может кто-нибудь объяснить, почему происходит следующее? И как решить, Visual Studio 2010 и MVC2

<%= Html.ActionLink("Add New Option", "AddOption", "Product", new { @class = "lighbox" }, null)%>

Результаты в

/ Продукт / AddOption? Класс = * лайтбокс 1007 *

<%= Html.ActionLink("Add New Option", "AddOption", "Product", new { @class = "lighbox" })%>

Результаты в

/ Продукт / AddOption? Length = 7

Спасибо

Ответы [ 2 ]

20 голосов
/ 24 мая 2010

Вы используете эти соответствующие перегрузки:

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. Иногда может помочь использование именованных аргументов (C # 4.0), чтобы сделать вещи более читабельными:

<%= Html.ActionLink(linkText: "Add New Option", 
   actionName: "AddOption",
   controllerName: "Product", 
   htmlAttributes: new { @class = "lighbox" }, 
   routeValues: null)%>
10 голосов
/ 24 мая 2010

Это пример "ада перегрузки" в 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, следовательно, «Длина = 7» вы получаете в маршруте.

Рассматривая первый метод, кажется, что вы поменяли местами параметры routeValues и htmlAttributes.

...