在application_beginrequest()中使用urlhelper


  • MVC 5

我需要在Application_BeginRequest()中调用URLHELPER,以在应用程序其他地方设置一些URL值。但是,当我称其为如下:

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

(我正在使用T4MVC,因此Mvc.bands.index()部分来自并最终返回Action Result)。我得到以下例外:

'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.rnParameter 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)rn   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)rn   at System.Web.Mvc.UrlHelper.RouteUrl(String routeName, RouteValueDictionary routeValues, String protocol, String hostName)rn   at System.Web.Mvc.T4Extensions.Action(UrlHelper urlHelper, ActionResult result, String protocol, String hostName)rn   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)}

为什么reuteCollection null?我本来希望它已经在处理请求时已经旋转了。

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

MVC提供了一种以更可维护的方式 - 全球过滤器来执行跨切割问题的方法。如果您坚持使用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());
    }
}

您可以选择实现可以放置在操作方法和/或控制器上的自定义属性,以在特定的操作上运行/不运行。

最新更新