Asp.net mvc ASP.NETMVC:需要特定路由的指导线

Asp.net mvc ASP.NETMVC:需要特定路由的指导线,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我的路由代码不工作 我以表格格式显示数据,并进行排序和分页。我的解决办法奏效了。当我将鼠标悬停在列上时,url看起来像http://localhost:55831/Customers?page=2&SortColumn=CompanyName&CurrentSort=ContactName 当我点击分页数字链接时,url看起来像http://localhost:55831/Customers?page=3&SortColumn=ContactName 我想我的网址应该像 1) (二) 所以我添

我的路由代码不工作

我以表格格式显示数据,并进行排序和分页。我的解决办法奏效了。当我将鼠标悬停在列上时,url看起来像
http://localhost:55831/Customers?page=2&SortColumn=CompanyName&CurrentSort=ContactName

当我点击分页数字链接时,url看起来像
http://localhost:55831/Customers?page=3&SortColumn=ContactName

我想我的网址应该像 1) (二)

所以我添加了一个路由代码。给你

    routes.MapRoute(
        name: null,
        url: "Customers/{page}/{SortColumn}/{CurrentSort}",
        defaults: new
        {
            action = "Index",
            page = UrlParameter.Optional,
            SortColumn = UrlParameter.Optional,
            CurrentSort = UrlParameter.Optional
        }
    );
添加上述路由代码后,url看起来有点奇怪。现在url看起来像

http://localhost:55831/Customers/1/CompanyName/CompanyName?controller=Customers
http://localhost:55831/Customers/2/CompanyName?controller=Customers
所以当我点击上面的链接时,我并没有重定向到正确的控制器和操作,而是出现了错误

这意味着我在route.config.cs文件中添加为路由的代码中存在一些问题

所以,请帮助我得到我想要的网址,我上面提到的。谢谢

编辑 我的完整路由代码

    routes.MapRoute(
        name: null,
        url: "{controller}/{action}/{page}/{SortColumn}/{CurrentSort}",
        defaults: new
        {
            action = "Index",
            page = UrlParameter.Optional,
            SortColumn = UrlParameter.Optional,
            CurrentSort = UrlParameter.Optional
        }
    );

    routes.MapRoute(
        name: null,
        url: "{controller}/{action}/{page}/{id}",
        defaults: new
        {
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional,
            page = UrlParameter.Optional,
        }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

这将不起作用,因为您的路由具有与其他路由冲突的可选参数

例如,以url
/MyController/MyAction/MyPage/213
为例

路由如何确定您是否需要:
{controller}/{action}/{page}/{id}
{controller}/{action}/{page}/{SortColumn}/{CurrentSort}

一种解决方案可能是删除可选参数:

page = UrlParameter.Optional,
SortColumn = UrlParameter.Optional,
CurrentSort = UrlParameter.Optional
因此,您的路线看起来更像这样:

routes.MapRoute(
    name: "PageWithSort",
    url: "{controller}/{action}/{page}/{SortColumn}/{CurrentSort}",
    defaults: new { action = "Index" }
);

routes.MapRoute(
    name: "PageWithId",
    url: "{controller}/{action}/{page}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
@Html.RouteLink("Link Text", "RouteName", new { controller = "xxx" })
但是,这里仍然会与
PageWithId
默认路径发生冲突。因此,如果您从未在默认路由中使用
id
,则可能需要删除其中的可选参数。或者,如果所有带有
页面
的路由始终具有
id
,则您可以删除其中的可选参数。或者,如果<代码>页< /代码>和<代码> ID <代码>是真正可选的,您可以考虑删除默认路由为<代码> PageWithId < /代码>,这两个选项将处理这两个。

旁注:您应该始终命名您的路线,因为稍后它将允许您执行以下操作:

routes.MapRoute(
    name: "PageWithSort",
    url: "{controller}/{action}/{page}/{SortColumn}/{CurrentSort}",
    defaults: new { action = "Index" }
);

routes.MapRoute(
    name: "PageWithId",
    url: "{controller}/{action}/{page}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
@Html.RouteLink("Link Text", "RouteName", new { controller = "xxx" })

从您提供的代码中,您可以考虑更改

@Html.ActionLink("Company", "Index", new { page = ViewBag.CurrentPage, SortColumn = "CompanyName", CurrentSort = ViewBag.CurrentSort })


这将不起作用,因为您的路由具有与其他路由冲突的可选参数

例如,以url
/MyController/MyAction/MyPage/213
为例

路由如何确定您是否需要:
{controller}/{action}/{page}/{id}
{controller}/{action}/{page}/{SortColumn}/{CurrentSort}

一种解决方案可能是删除可选参数:

page = UrlParameter.Optional,
SortColumn = UrlParameter.Optional,
CurrentSort = UrlParameter.Optional
因此,您的路线看起来更像这样:

routes.MapRoute(
    name: "PageWithSort",
    url: "{controller}/{action}/{page}/{SortColumn}/{CurrentSort}",
    defaults: new { action = "Index" }
);

routes.MapRoute(
    name: "PageWithId",
    url: "{controller}/{action}/{page}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
@Html.RouteLink("Link Text", "RouteName", new { controller = "xxx" })
但是,这里仍然会与
PageWithId
默认路径发生冲突。因此,如果您从未在默认路由中使用
id
,则可能需要删除其中的可选参数。或者,如果所有带有
页面
的路由始终具有
id
,则您可以删除其中的可选参数。或者,如果<代码>页< /代码>和<代码> ID <代码>是真正可选的,您可以考虑删除默认路由为<代码> PageWithId < /代码>,这两个选项将处理这两个。

旁注:您应该始终命名您的路线,因为稍后它将允许您执行以下操作:

routes.MapRoute(
    name: "PageWithSort",
    url: "{controller}/{action}/{page}/{SortColumn}/{CurrentSort}",
    defaults: new { action = "Index" }
);

routes.MapRoute(
    name: "PageWithId",
    url: "{controller}/{action}/{page}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
@Html.RouteLink("Link Text", "RouteName", new { controller = "xxx" })

从您提供的代码中,您可以考虑更改

@Html.ActionLink("Company", "Index", new { page = ViewBag.CurrentPage, SortColumn = "CompanyName", CurrentSort = ViewBag.CurrentSort })


只有最后一个参数可以标记为
UrlParameter。可选的
@StephenMuecke是的,我按照你说的做了,但url看起来仍然是这样,并且此链接不起作用。请尝试在中添加
controller=“Customers”
defaults@StephenMuecke应该有用。原因是您并没有指定默认情况下路由映射到哪个控制器,并且由于路由映射到控制器/操作,当mvc生成url时,它会自动将当前控制器附加到url。因为在目标路由中没有“controller”参数的占位符,所以它被附加为querystringparameter@Talha5389我再次更改了路由代码,但仍然没有得到友好的url`routes.MapRoute(名称:null,url:{controller}/{action}/{page}/{SortColumn}/{CurrentSort}”,默认值:new{action=“Index”,page=urlparmeter.Optional,SortColumn=urlparmeter.Optional,CurrentSort=urlparmeter.Optional})`只有最后一个参数可以标记为
UrlParameter。可选的
@StephenMuecke是的,我按照你说的做了,但url看起来仍然是这样,并且此链接不起作用。请尝试在中添加
controller=“Customers”
defaults@StephenMuecke应该有用。原因是您并没有指定默认情况下路由映射到哪个控制器,并且由于路由映射到控制器/操作,当mvc生成url时,它会自动将当前控制器附加到url。因为在目标路由中没有“controller”参数的占位符,所以它被附加为querystringparameter@Talha5389我再次更改了路由代码,但仍然没有得到友好的url`routes.MapRoute(名称:null,url:{controller}/{action}/{page}/{SortColumn}/{CurrentSort}”,默认值:new{action=“Index”,page=urlparmeter.Optional,SortColumn=urlparmeter.Optional,CurrentSort=urlparmeter.Optional})`我已经添加了你的路由代码,但仍然没有成为非常友好的链接url。下面是测试项目链接,请运行并测试代码。这是一个测试项目,数据库在app_数据文件夹中。项目规模非常小。正在寻求您的进一步帮助。@MonojitSarkar我在回答的最后添加了一个路由链接示例。我可以将
@Html.ActionLink更改为@Html.RouteLink
,但我