【问题标题】:Add extra data as part of url and not as parameter添加额外数据作为 url 的一部分,而不是作为参数
【发布时间】:2016-06-20 07:27:44
【问题描述】:

所以我在MVC 中阅读了有关routes 的信息,并根据其他帖子中提到的内容进行了配置。所以我的意图是生成如下网址:

http://domain.com/controller/action/id

出于这个目的,我将RoutesConfig.cs 配置如下:

routes.MapRoute(
      name: "AdminMessage",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Admin", action = "Messages", id = UrlParameter.Optional }
);

下面是我的控制器的样子

[HttpGet]
public ActionResult Messages(string id)
{
    _model = new AdminViewModel();
    _userName = Convert.ToString(HttpContext.User.Identity.Name);
    ViewBag.Page = "Messages";
    _model = PrepareLayoutModel(_userName, "Messages");
    return View(_model);
}

我使用Url.Action 生成url 如下:

<a href="@Url.Action("Messages", "Admin", new RouteValueDictionary(new {message.MessageID}))"></a>

但它总是将Url 生成为http://domainname/controller/action?messageID=SDc@#123#2@,而我想将其生成为http://domainname/controller/action/SDc@#123#2@。那么我可以通过什么方式完成这项工作?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 routing


    【解决方案1】:

    应该是

    @Url.Action("Messages", "Admin", new { ID = message.MessageID })
    

    它创建了一个具有名为 ID 的属性的对象(它与您的路线匹配),而不是您当前的实现,它使用的是一个名为 MessageID 的对象属性,它与您的路线不匹配,因此它的值作为查询添加字符串值

    【讨论】:

    • 完美.. 愚蠢的错误不断发生.. :(
    • 我可以在这里再问一个问题吗?如何在Razor view 中获取id 参数?我尝试使用Request.QueryString[0]Request.QueryString["id"],但两次都返回null.. 现在最后一部分将被视为querystring 吗?我怎样才能得到这个?
    • 因为您有url: "{controller}/{action}/{id}",,所以该值被添加为路由值,而不是查询字符串值。但是因为方法中的参数是string id,那么那个参数就是message.MessageID的值(你也可以使用HttpContext.Current.Request.RequestContext.RouteData.Values["id"];来访问路由值,但这是不必要的)
    • 是的..那是正确的.. :) 非常感谢您的信息.. 祝您度过愉快的时光.. :)
    【解决方案2】:

    试试这样:

    <a href="@Url.Action("Messages", "Admin", new { id = message.MessageID })"></a>
    

    或者甚至更好地使用 Html.ActionLink 帮助器,它将生成一个指向所需控制器操作的锚标记并传递 id 路由参数值:

    @Html.ActionLink(
        linkText: "", 
        actionName: "Messages", 
        controllerName: "Admin", 
        routeValues: new { id = message.MessageID }, 
        htmlAttributes: null
    )
    

    话虽如此,如果您打算在 url 的路由部分传递特殊字符,您应该be prepared to suffer。在这种情况下,我会简单地建议您使用查询字符串参数,这些参数不仅可以安全地进行 url 编码,而且不会让您感到痛苦。因此,基本上,如果您不控制此 MessageID 参数的格式并将其缩小为基本的字母数字字符,那么您完全不希望它作为您的路线段的一部分。

    【讨论】:

    • 感谢@Darin 提供的额外信息。我忘了提到我不能使用@Html.ActionLink,因为a 标签内还有一些其他元素...非常感谢您的时间和帮助.. :)
    • 以不同的方式加 20.. ;)
    • 我想不出任何反对使用标准 HTML 帮助程序(例如 Html.ActionLink)的可行理由。即使您需要在链接文本中添加一些自己的废话,您也可以始终编写自定义 HTML 帮助程序,而不是以 HTML DOM 标记和服务器端帮助程序之间的这种可怕的意大利面条混合作为 DOM 元素的属性。
    • 好吧,那么我必须考虑创建一个自定义 HTML 帮助程序,因为我对它们的了解非常有限.. 我一定会调查的,伙计.. :) 谢谢.. :)跨度>
    • 哦,您绝对应该考虑创建自定义 HTML 帮助程序。我简直不敢相信人们如何在没有自定义的情况下在现实世界的应用程序中使用 Razor。
    猜你喜欢
    • 2016-08-28
    • 2021-10-31
    • 2021-10-17
    • 2018-06-10
    • 2015-05-05
    • 2020-03-22
    • 1970-01-01
    • 2016-02-04
    • 2020-11-05
    相关资源
    最近更新 更多