为啥有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中?
Posted
技术标签:
【中文标题】为啥有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中?【英文标题】:Why do some parameters get added using pre-defined routes while others are placed in a query string?为什么有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中? 【发布时间】:2014-11-13 03:27:22 【问题描述】:我试图将两条信息从一个视图传递到另一个视图。从操作链接创建的 URL 使用查询字符串,而不是使用 RouteConfig 文件中定义的路由将参数放在 URL 中。
路由配置
public class RouteConfig
public static void RegisterRoutes(RouteCollection routes)
routes.IgnoreRoute("resource.axd/*pathInfo");
routes.MapRoute(
name: "Default",
url: "controller/action/id",
defaults: new controller = "Home", action = "Index", id = UrlParameter.Optional
);
routes.MapRoute(
name: "UserDetail",
url: "controller/action/system/id",
defaults: new controller = "Search", action = "UserDetails", system = UrlParameter.Optional, id = UrlParameter.Optional
);
routes.MapRoute(
name: "Search",
url: "controller/action/searchText",
defaults: new controller = "Search", action = "Index", searchText = UrlParameter.Optional
);
搜索结果视图
<table>
<thead>
<tr>
<td></td>
@foreach (DataColumn _col in Model.Columns)
<td>@_col.ColumnName</td>
</tr>
</thead>
<tbody>
@foreach (DataRow _row in Model.Rows)
<tr>
<td>
@html.ActionLink("View", "UserDetails", "Search", new system = _row["System"], id = _row["UserID"] , null);
</td>
@foreach (DataColumn _col in Model.Columns)
<td>@_row[_col.ColumnName]</td>
</tr>
</tbody>
</table>
以下行总是创建一个使用查询字符串的 URL...
@Html.ActionLink("View", "UserDetails", "Search", new system = _row["System"], id = _row["UserID"] , null);
创建的内容:
http://localhost:54137/Search/UserDetails/91605?system=SP
我想要什么:
http://localhost:54137/Search/UserDetails/SP/91605
这是我正在使用的视图的控制器。
[HttpGet]
public ActionResult UserDetails(string system, int? id)
if (id == null || system == null || string.IsNullOrEmpty(system))
ViewBag.SearchResult = "No User ID was selected";
else
ViewBag.SearchResult = "You searched for User ID: " + id + " in the " + system + " system";
return View();
【问题讨论】:
请看***的以下链接***.com/questions/17640536/… 根据那个链接,我想改变 到 。这会从创建的链接中删除所有参数,因为它使用了错误的签名。它会创建如下链接:localhost:54137/Search/UserDetails。我认为这个链接是一个不同的问题。如果不是,请进一步解释。 我的错,在那个上面放了一个脑袋。您本质上是在寻找属性路由,您可能需要这样做 @Html.ActionLink("View", "UserDetails", "Search/" + _row["system"] "/" + _row["UserId"] )。 这看起来确实像是 ActionLink 本身的限制。个人从未遇到过,但我确实喜欢 Attribute Routing 的简洁外观。@Html.ActionLink
在您的路由表上自上而下,您的第二条路由将永远不会被使用。要指定要用于链接的路由,请改用@Html.RouteLink()
。
【参考方案1】:
这是因为路由引擎只是按照您注册的顺序来处理您的路由注册。第一个似乎匹配的将被选中。因此,您需要重新安排注册路线的顺序,从最具体的路线开始。
public class RouteConfig
public static void RegisterRoutes(RouteCollection routes)
routes.IgnoreRoute("resource.axd/*pathInfo");
routes.MapRoute(
name: "UserDetail",
url: "controller/action/system/id",
defaults: new controller = "Search", action = "UserDetails", system = UrlParameter.Optional, id = UrlParameter.Optional
);
routes.MapRoute(
name: "Search",
url: "controller/action/searchText",
defaults: new controller = "Search", action = "Index", searchText = UrlParameter.Optional
);
routes.MapRoute(
name: "Default",
url: "controller/action/id",
defaults: new controller = "Home", action = "Index", id = UrlParameter.Optional
);
【讨论】:
我知道我遗漏了一些微不足道的东西......这很好!感谢您的快速回复! 没问题,很高兴能帮上忙! :)以上是关于为啥有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Django 中的一些包含需要字符串,而另一些需要变量名?