2010-05-24 2 views
10

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

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

Результаты в

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

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

Результаты в

/Продукт/AddOption? Длина = 7

Благодаря

ответ

20

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

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)%> 
9

Это пример «перегрузка ад» в 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 во втором один. Строковое значение «Продукт» передается маршрутизируемым значениям: используется свойство строки Length, длина которого здесь 7, следовательно, длина «7 = 7», которую вы получаете на маршруте.

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

Смежные вопросы