Asp.net mvc 如何使用我的路线在global.asax中生成url。int asp.net mvc

Asp.net mvc 如何使用我的路线在global.asax中生成url。int asp.net mvc,asp.net-mvc,asp.net-mvc-routing,url-routing,global-asax,Asp.net Mvc,Asp.net Mvc Routing,Url Routing,Global Asax,我在global.asax中的BeginRequest事件中有一些功能,可以解析请求url,检查其中的一些部分,并将用户重定向到另一个url 问题:如何从routeName生成url。我想这样做,因为若路由将被改变,重定向功能将工作。 我不喜欢代码: String.Format("{0}/{1}/{2}", host, part1, part2); 在视图中,我可以使用Url.RouteUrl,但在global.asax中,我必须使用RequestContext和RouteData参数手动创建

我在global.asax中的BeginRequest事件中有一些功能,可以解析请求url,检查其中的一些部分,并将用户重定向到另一个url

问题:如何从routeName生成url。我想这样做,因为若路由将被改变,重定向功能将工作。 我不喜欢代码:

String.Format("{0}/{1}/{2}", host, part1, part2);
在视图中,我可以使用Url.RouteUrl,但在global.asax中,我必须使用RequestContext和RouteData参数手动创建UrlHelper对象。在哪里可以获取RoutedData对象

我在global.asax中的BeginRequest事件中有一些功能,可以解析请求url,检查其中的一些部分,并将用户重定向到另一个url

实现这一点的一种更为MVCish的方法是使用,并在调用控制器操作之前调用的方法中执行此处理:

public class CustomFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // read some value from the request
        string value = filterContext.RequestContext.RouteData.Values["someValue"] as string;
        if (!IsValueValid(value))
        {
            // if the value is invalid redirect to some controller action
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary(new
                {
                    action = "foo",
                    controller = "bar"
                })
            );
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
    }
}

现在剩下的就是用这个属性来装饰你的基本控制器,使它适用于所有动作。

谢谢你的回复。但对于我的情况,我必须在global.asax中处理这种情况,因为我使用unity进行注射。若我选择actionfilter属性机制,那个么创建控制器实例将被执行,若我使用begin请求,则不会执行任何操作。是否有更高性能的差异?您为什么必须在global.asax中处理此问题?为什么不从ASP.NET MVC提供的功能中获益?我的意思是你已经选择了使用ASP.NET MVC,那么为什么不正确地使用它呢?我没有完成我的回答,然后按回车键:对不起。我对stack overflow还不熟悉。好吧,接下来的问题是:为什么实例化控制器对您来说是一个昂贵的操作?不应该是这样的。创建控制器的操作并不昂贵,但我在每个控制器中都注入了大约10-15个对象。有些像蓟一样轻,但有些更重。