添加额外数据作为 url 的一部分而不是作为参数

Add extra data as part of url and not as parameter

所以我已经阅读了 MVC 中的 routes 并根据其他帖子中提到的内容进行了配置。所以我的目的是生成 url 如下:

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@。那么我可以通过什么方式完成这项工作?

这样试试:

<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 参数的格式并将其缩小为基本的字母数字字符,那么您完全不希望它成为您的路线段的一部分。

需要

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

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