首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从自定义MvcRouteHandler返回到路由表中的下一个

如何从自定义MvcRouteHandler返回到路由表中的下一个
EN

Stack Overflow用户
提问于 2014-10-28 23:45:52
回答 1查看 1.4K关注 0票数 2

我有一个定制的MvcRouteHandler,它检查数据库是否存在一个Url,并将它与某个控制器操作和Id配对。

但是,如果这个路由处理程序在数据库中找不到匹配的对,我希望MVC继续尝试在路由表中使用其他定义的路由处理程序。

我怎么能这么做?

更新:(添加示例代码)

代码语言:javascript
复制
routes.MapRoute(
    name: "FriendlyRoute",
    url: "{FriendlyUrl}").RouteHandler = new FriendlyRouteHandler();

FriendlyRouteHandler是:

代码语言:javascript
复制
public class FriendlyRouteHandler : MvcRouteHandler
{
    private TancanDbContext db = new MyDbContext();

    protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
    {
        if (requestContext.RouteData.Values["FriendlyUrl"] != null)
        { 
            string friendlyUrl = requestContext.RouteData.Values["FriendlyUrl"].ToString();

            //Here, you would look up the URL Record in your database, then assign the values to Route Data
            //using "where urlRecord.Url == friendlyUrl"         
            try
            {
                UrlRecord urlRecord = db.UrlRecords.Single(u => u.URL == friendlyUrl);          
                //Now, we can assign the values to routeData
                if (urlRecord != null)
                {
                    requestContext.RouteData.Values["controller"] = urlRecord.Controller;
                    requestContext.RouteData.Values["action"] = urlRecord.Action;
                    if(urlRecord.EntityId != null)
                    requestContext.RouteData.Values["id"] = urlRecord.ObjectId;
                   }
                }
                else
                {
                    //Here, I want to redirect to next RouteHandler in route Table
                  requestContext.RouteData.Values["controller"] = friendlyUrl;
                }
            }
            catch (Exception ex)
            {               
                //throw;
                //Here too, I want to redirect to next RouteHandler in route Table
                requestContext.RouteData.Values["controller"] = friendlyUrl;
            }
        }
        return base.GetHttpHandler(requestContext);
    }
}

在添加了这一行之后,它似乎工作了:

代码语言:javascript
复制
requestContext.RouteData.Values["controller"] = friendlyUrl;

我是幸运还是这样做是对的?我需要在什么地方使用IRouteConstraint吗?

顺便说一下,我的影响力是本文作者为Adam Riddick

EN

回答 1

Stack Overflow用户

发布于 2018-03-20 19:09:34

您希望为此使用自定义约束,而不是自定义处理程序。

代码语言:javascript
复制
routes.MapRoute(
    name: "example",
    url: "{friendly}",
    defaults: new { controller = "FriendlyController", action = "Display" },
    constraints: new { friendly = new FriendlyUrlConstraint() }
);

然后约束变成:

代码语言:javascript
复制
public class FriendlyUrlConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var friendlyUrl = values[parameterName];

        // Your logic to return true/false here
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26620464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档