首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UrlHelper中使用Application_BeginRequest()

在UrlHelper中使用Application_BeginRequest()
EN

Stack Overflow用户
提问于 2017-02-17 02:22:51
回答 1查看 505关注 0票数 0
  • MVC 5

我需要在UrlHelper ()中调用Application_BeginRequest()来在应用程序的其他地方设置一些URL值。然而,当我这样称呼它时:

代码语言:javascript
复制
var urlHelper = new UrlHelper();
urlHelper.Action(MVC.Bands.Index())

(我使用的是T4MVC,所以这就是MVC.Bands.Index()部分的来源,并最终返回ActionResult)。我得到以下例外:

代码语言:javascript
复制
'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为空?我原以为我们正在处理一项请求时,已经把它编出来了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-17 05:00:08

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

MVC提供了一种以更易于维护的方式执行交叉关注点的方法-- 全局滤波器。如果您坚持使用MVC,而不是总是依赖遗留的ASP.NET API,那么您将发现完成这样的任务要容易得多。

代码语言:javascript
复制
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())
    }
}

用法

全局注册筛选器确保它在每个请求之前运行。

代码语言:javascript
复制
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new MyActionFilter());
        filters.Add(new HandleErrorAttribute());
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42288294

复制
相关文章

相似问题

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