我需要在UrlHelper ()中调用Application_BeginRequest()来在应用程序的其他地方设置一些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为空?我原以为我们正在处理一项请求时,已经把它编出来了。
发布于 2017-02-17 05:00:08
Application_BeginRequest是一个遗留的ASP.NET API。虽然有时很有用,但在MVC中通常没有必要使用它。由于它不是一个MVC API,因此期望任何MVC功能在那里工作是不合理的。MVC建立在ASP.NET之上,而不是反过来。
MVC提供了一种以更易于维护的方式执行交叉关注点的方法-- 全局滤波器。如果您坚持使用MVC,而不是总是依赖遗留的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());
}
}您可以选择实现一个自定义属性,它可以放在操作方法和/或控制器上,以便在特定操作上运行/不运行。
https://stackoverflow.com/questions/42288294
复制相似问题