所以我在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@
。那么我能做到这一点的方式是什么?
答案 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
的对象属性的实现,该对象属性与您的路由不匹配,因此其值为添加为查询字符串值