【问题标题】:html.ActionLink(): ViewController stops working if class Attribute is addedhtml.ActionLink():如果添加了类 Attribute,ViewController 将停止工作
【发布时间】:2018-11-09 06:28:55
【问题描述】:

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

我开始只为管理页面设置功能,所以我从未意识到我的 UserController 不起作用。它总是将我路由到 Admin/Somepage 而不是 User/Somepage。

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

如果我使用

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

一切正常。

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

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

它停止工作。当我现在单击指向用户主页的链接时,它会路由到 Admin/UserHome 而不是 User/UserHome 并且显然找不到该页面。

这是为什么呢?有人经历过吗?

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

【问题讨论】:

  • 如果你使用new { @class= "someClass" }会发生什么?请注意,class 是保留关键字,因此您需要使用前缀 @ 对其进行转义
  • 因为需要@Html.ActionLink("User", "UserHome", "User", null, new { class= "someClass" })
  • 那么可能是上述两个 cmets 的混合:@Html.ActionLink("User", "UserHome", "User", null, new { @class= "someClass" })

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


【解决方案1】:

因为正如 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)

【讨论】:

    【解决方案2】:

    您使用了错误的重载。通过使用这个:

    @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,因为您的控制器操作似乎不需要任何路由值。

    【讨论】:

    • 你为什么链接同一个链接两次?
    • @Rafalon 我的错。固定的。谢谢。
    • 不客气。但是,请重新阅读第四个参数(第一个重载)和五个参数(第二个重载)部分。似乎您将this 计为第一次重载,而您不计入第二次。还是我数错了?
    • 谢谢!太糟糕了,以至于没有意识到我的错误。我认为因为类 Element 正在工作并且 AdminController 也可以工作,所以代码应该没问题。错过了中间还有一个参数。
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 2012-05-19
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多