我需要具有以下网址之类的路由的功能。

/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/

10-12 12:43