igg*_*web 6 c# url-routing asp.net-mvc-5
我配置了多个路由,但由于某些原因,尽管规则处理不同的控制器和不同的视图,但不同的链路路由到同一视图.请看下面,我已经包含了我的RouteConfig文件和下面的示例链接:
RouteConfig.cs
using System.Web.Mvc;
using System.Web.Routing;
namespace WebApplication1
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Account",
url: "Account/{action}/{id}",
defaults: new { controller = "Account", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Member",
url: "Member/{action}/{id}",
defaults: new { controller = "Member", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Root",
url: "{action}/{id}",
defaults: new { controller = "Home", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Details",
url: "{controller}/{action}/{u}",
defaults: new
{
controller = "Member",
action = "Details",
u = UrlParameter.Optional
}
);
routes.MapRoute(
name: "Article",
url: "{Home}/{Article}/{id}/{articleName}",
defaults: new { controller = "Home", action = "Article" }
);
routes.MapRoute(
name: "Item",
url: "{News}/{Item}/{id}/{itemName}",
defaults: new { controller = "News", action = "Item" }
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
链接
http://localhost:11508/Home/Article/2/Participate
http://localhost:11508/News/Item/2/Second-Test
Run Code Online (Sandbox Code Playgroud)
可以看出,链接和规则肯定是唯一的,但由于某种原因,Item规则被忽略,它只是将Id 2传递给Home/Article视图.
您不应在括号中包含控制器/操作名称 - 只需按原样传递它们,以便可以匹配路径。您的最后两条路线应如下所示:
routes.MapRoute(
name: "Article",
url: "Home/Article/{id}/{articleName}",
defaults: new { controller = "Home", action = "Article" }
);
routes.MapRoute(
name: "Item",
url: "News/Item/{id}/{itemName}",
defaults: new { controller = "News", action = "Item" }
);
Run Code Online (Sandbox Code Playgroud)
此外,最好将此类特定路由放置在任何其他路由之前,而不是默认路由之后。
更新
基本上它应该是一个单独的问题,但在这里回答会更容易。
来自评论:
我如何能够
http://localhost:11508/Member/Details?u=testuser被路由到http://localhost:11508/Member/Details/testuser而不是显示参数。
创建接受此参数的控制器操作,如下所示:
public ActionResult Details(string u, ...)
{
var model = new ...
...
return View(model);
}
Run Code Online (Sandbox Code Playgroud)注册路由,它接受u参数作为 URL 部分,就像这个
routes.MapRoute(
name: "MyRoute",
url: "Member/Details/{u}",
defaults: new { controller = "Member", action = "Details", u = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
这里{u}实际上声明了参数名称,以及如何在 URL 中使用(解析/渲染)它。
渲染到 URL 的链接如下所示:
<a href="@Url.Action("Details", "Member", new {u = "testuser"})">linktext</a>
Run Code Online (Sandbox Code Playgroud)在所有这些步骤中,u是您将使用的参数名称。