我需要具有以下网址之类的路由的功能。
/authorid
/documentid
/authorid/documentid
我试图不做
/author/1
/document/5
author/1/document/25
如何才能做到这一点?
澄清。
文档和作者可以具有相同的ID。但是作者应该优先。
作者:{ID:“ djQuery”}
文件:{Aurhor:“ Bob”,ID:“ djQuery”}
应该可以通过/ Bob / djQuery访问
但是,如果只是转至/ djQuery,则应获取djQuery文档的列表。
最佳答案
您可以通过三个路线和相应的RouteConstraints
实现所需的功能。
首先,您需要建立路线:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Author_Document", // Route name
"{author}/{document}", // URL
new { controller = "ShowDocument", action = "AuthorDocument" }, // Parameters
new { author = new MustBeValidAuthor(), document = new MustBeValidDocument() }
routes.MapRoute(
"Author", // Route name
"{author}", // URL
new { controller = "ShowDocument", action = "Author" }, // Parameters
new { author = new MustBeValidAuthor() }
routes.MapRoute(
"Document", // Route name
"{document}", // URL
new { controller = "ShowDocument", action = "Document" }, // Parameters
new { document = new MustBeValidDocument() }
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
接下来,您需要创建RouteConstraints,它必须验证所提供的信息是否有效:
using System;
using System.Web;
using System.Web.Routing;
namespace ExampleApp.Extensions
{
public class MustBeValidAuthor : IRouteConstraint
{
public MustBeValidAuthor() { }
private DbContext _db = new DbContext();
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return (_db.Authors.Where(u => u.AuthorName == values[parameterName].ToString()).Count() > 0);
}
}
public class MustBeValidDocument : IRouteConstraint
{
public MustBeValidDocument() { }
private DbContext _db = new DbContext();
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return (_db.Documents.Where(u => u.DocumentName == values[parameterName].ToString()).Count() > 0);
}
}
}
RouteConstraints将增强请求的有效性,并且按此顺序放置Routes即可满足您的要求。
关于asp.net - 如何选择前往2个目的地的路线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7322923/