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

时间:2016-03-06 20:16:47

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

所以我在routes中了解了MVC并根据其他帖子中提到的内容进行了配置。所以我的目的是生成以下网址:

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@。那么我能做到这一点的方式是什么?

2 个答案:

答案 0 :(得分:1)

试试这样:

<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
)

这就是说,如果您打算在网址的路径部分传递特殊字符,则应be prepared to suffer。在这种情况下,我只是建议你使用查询字符串参数,这些参数可以安全地进行url编码而不会让你痛苦。所以基本上如果你不控制这个MessageID参数的格式并将其缩小到基本的字母数字字符,你就不会完全不希望它作为路线段的一部分。

答案 1 :(得分:1)

需要

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

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