【问题标题】:MVC: Html.ActionLink() Resolves to (Edit?Length=) instead of (Edit?Id=)MVC:Html.ActionLink() 解析为 (Edit?Length=) 而不是 (Edit?Id=)
【发布时间】:2014-04-22 22:45:17
【问题描述】:

我在我的 MVC 4 应用程序中创建了一个管理区域。在名为UserManage 的视图文件夹下,我使用Grid.MVC 在多个页面上列出用户(5 组)。在网格中,我列出了供管理员查看的用户详细信息,并添加了:

  • 包含复选框 [ ] 的列。
  • 包含EDIT 链接的列。
  • CREATE 按钮。
  • DELETE 按钮(与每行的复选框一起使用)。

我的用户详细信息页面位于我的管理区域下,路径如下:Project\Areas\Admin\Views\UserManage\Index.cshtml。在我的EDIT liniks 上,我试图在Project\Areas\Admin\Views\UserManage\Edit.cshtml 上调出视图并将个人UserID 传递给视图以调出该用户数据。

在下面我当前的代码中,我的浏览器解析为 http://localhost:62517/Admin/UserManage/Edit?Length=4 并出现 IIS 8.0 404 错误(控制器找不到用户 ID)。但是,如果我手动将Length 更改为Id,如下所示,一切都会按预期进行,我最终会看到Edit 视图:http://localhost:62517/Admin/UserManage/Edit?Id=4

这是Index.cshtml 页面的网格代码。有谁知道我需要在Html.ActionLink() 上修改什么,所以我的路线将解析为?Id= 而不是?Length=?:

<div class="overflowPrevention">
    @Html.Grid(Model).Columns(columns =>
        {
            columns.Add().Encoded(false).Sanitized(false).SetWidth(30).RenderValueAs(o => @Html.CheckBox("checked", false));
            columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => Html.ActionLink("Edit", "Edit", "Edit", new { id = "1" }));

        }).AutoGenerateColumns()
</div>

【问题讨论】:

  • 当您的控制器被称为UserManage 时,为什么您在Html.ActionLink("Edit", "Edit", "Edit", new { id = "1" }) 中将“编辑”作为控制器名称?
  • 实际上,正如我从重载中看到的那样,与您的调用签名匹配的那个会将“编辑”作为object routeValues,这也是长度为 4 的 IList - 也许你的问题可能与此有关?
  • @chiccodoro,这可能是长度 4 的问题。想解决的问题?
  • 您可以通过在通话中添加 , null 来解决此问题。
  • 或刷新此页面并找到 Dismissile 的答案,其中说明大致相同:-)

标签: asp.net-mvc asp.net-mvc-4 razor actionlink


【解决方案1】:

您使用了错误的重载。

@Html.ActionLink(string linkText, string actionName, string controllerName, object htmlAttributes)

而不是

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

如果您不需要使用 htmlAttributes,您可以只为它们传递 null:

Html.ActionLink("Edit", "Edit", "UserManage", new { id = "1" }, null)

我不确定您为什么要使用“编辑”、“编辑”、“编辑”。我认为这是一个错字,所以我将其更改为使用 UserManage 作为控制器名称。

【讨论】:

  • 接受你的建议,我玩弄了我的重载,以下产生了http://localhost:62517/Admin/UserManage/Edit/1 ==> Html.ActionLink("UserManage", "Edit", new { id = "1" }, null) 的工作路径。虽然现在我的链接被标记为 UserManage 而不是 Edit?
  • @AnalyticLunatic 第一个参数是链接文本,不是控制器。 1:链接文本,2:动作,3:控制器
  • 做到了,谢谢! :) 关于如何传递单个 UserId 而不是“1”的任何想法?
  • @AnalyticLunatic 我不确定您使用的是什么 Grid builder,但我敢肯定,如果您查看文档,您将能够找到方法。
  • 尝试了一番,终于搞定了。 columns.Add(o =&gt; o.Id).Encoded(false).Sanitized(false).RenderValueAs(o =&gt; Html.ActionLink("Edit", "Edit", "UserManage", new { id = o.Id }, null));;感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-09-16
  • 2015-11-05
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多