html.ActionLink():如果添加了类属性,ViewController将停止工作

时间:2018-05-30 11:54:34

标签: c# html asp.net-mvc razor actionlink

我今天在项目中遇到了一个非常奇怪的行为。 所以我正在一个网站上工作,该网站有一个管理员视图和一个共同的用户视图。这些页面存储在名为“Admin”的文件夹中,以及名为“User”的文件夹位于“Views”文件夹

我开始只为Admin页面设置功能,所以我从未意识到我的UserController不起作用。它始终将我转到管理员/某个页面而不是用户/某些页面。

经过一些测试后,我发现了以下问题:

如果我使用

@Html.ActionLink("Admin", "AdminHome", "Admin")
@Html.ActionLink("User", "UserHome", "User")

一切正常。

但是,只要我在链接中添加一个类,例如

@Html.ActionLink("User", "UserHome", "User", new { class= "someClass" })

它停止工作。当我现在点击链接到用户主页时,它会路由到管理员/用户主页而不是用户/用户主页,显然无法找到该页面。

为什么?有没有人经历过这个?

我的意思是我仍然可以将它包装在另一个div中并在那里添加类。我只是想知道这种行为背后是否有原因。

2 个答案:

答案 0 :(得分:2)

因为Stephen Muecke在他的评论中指出,你应该使用的方法是ActionLink(HtmlHelper, String, String, String, Object, Object),并带有以下签名:

public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string actionName,
    string controllerName,
    object routeValues,
    object htmlAttributes
)

@Html.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes)

您目前正在使用ActionLink(HtmlHelper, String, String, Object, Object)以下签名:

public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string actionName,
    object routeValues, // here you passed controllerName ("User") instead
    object htmlAttributes
)

@Html.ActionLink(linkText, actionName, routeValues, htmlAttributes)

答案 1 :(得分:-1)

您正在使用错误的重载。通过使用:

@Html.ActionLink("User", "UserHome", "User", new { class= "someClass" })

ASP.Net MVC认为the fourth parameter is route values并非如此。

为了使其按预期工作,您需要使用this overload that takes five parameters并将属性设置在第五个位置,如下所示:

@Html.ActionLink("User", "UserHome", "User", null, new { class= "someClass" })

我将null设置为第四个参数,因为看起来您的控制器操作不需要任何路由值。