在Application_BeginRequest()中使用UrlHelper

时间:2017-02-17 02:22:51

标签: asp.net-mvc t4mvc

  • MVC 5

我需要在Application_BeginRequest()中调用UrlHelper,在应用程序的其他位置设置一些URL值。但是当我把它称为如下:

var urlHelper = new UrlHelper();
urlHelper.Action(MVC.Bands.Index())

(我正在使用T4MVC,因此这是MVC.Bands.Index()部分来自最终返回ActionResult的地方。我得到以下异常:

'urlHelper.Action(MVC.Sur.Maintenance.Index())' threw an exception of type 'System.ArgumentNullException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2147467261
    HelpLink: null
    InnerException: null
    Message: "Value cannot be null.\r\nParameter name: routeCollection"
    ParamName: "routeCollection"
    Source: "System.Web.Mvc"
    StackTrace: "   at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)\r\n   at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, String protocol, String hostName, String fragment, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)\r\n   at System.Web.Mvc.UrlHelper.RouteUrl(String routeName, RouteValueDictionary routeValues, String protocol, String hostName)\r\n   at System.Web.Mvc.T4Extensions.Action(UrlHelper urlHelper, ActionResult result, String protocol, String hostName)\r\n   at System.Web.Mvc.T4Extensions.Action(UrlHelper urlHelper, ActionResult result)"
    TargetSite: {System.String GenerateUrl(System.String, System.String, System.String, System.Web.Routing.RouteValueDictionary, System.Web.Routing.RouteCollection, System.Web.Routing.RequestContext, Boolean)}

为什么routeCollection为NULL?在我们处理请求时,我原本预计它已经被启动了。

1 个答案:

答案 0 :(得分:0)

Application_BeginRequest是一个遗留的ASP.NET API。虽然有时很有用,但通常不需要在MVC中使用。由于它不是MVC API,因此期望任何MVC功能在那里工作是不合理的。 MVC建立在ASP.NET之上,而不是相反。

MVC提供了一种以更易于维护的方式执行跨领域问题的方法 - global filters。如果你坚持使用MVC API而不是总是回到遗留的ASP.NET API上,你会发现完成这样的任务要容易得多。

public class MyActionFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var urlHelper = new UrlHelper(filterContext.RequestContext, System.Web.Routing.RouteTable.Routes);
        string result = urlHelper.Action(MVC.Bands.Index())
    }
}

用法

全局注册过滤器可确保在每个请求之前运行过滤器。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new MyActionFilter());
        filters.Add(new HandleErrorAttribute());
    }
}

您可以选择实施可放置在操作方法和/或控制器上的Custom Attribute,以便在特定操作上运行/不运行。