为啥有些参数是使用预定义的路由添加的,而另一些则放在查询字符串中?

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 中的一些包含需要字符串,而另一些需要变量名?

如果一些被解构而另一些没有被解构,如何记录函数的参数(JSDoc)

为啥有些包含守卫具有定义的值?

容器领域的十大监控系统对比(上)