Asp. Сетевой MVC ActionLink

Кто-либо может объяснить, почему следующее происходит? И как решить, 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

Спасибо

10
задан David Neale 24 May 2010 в 14:34
поделиться

2 ответа

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

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)%>
20
ответ дан 3 December 2019 в 15:05
поделиться

Это пример «ада перегрузки» в 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 .

10
ответ дан 3 December 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: