为什么使用预定义路由添加一些参数而其他参数放在查询字符串中?

问题描述 投票:1回答:1

我试图将两条信息从一个视图传递到另一个视图。从操作链接创建的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();
    }
asp.net-mvc razor routes url-parameters
1个回答
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 }
        );
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.