从Global.asax中获取操作的绝对URL路径

时间:2013-05-29 16:43:25

标签: asp.net asp.net-mvc

对不起基本问题。

Global.asax内,我希望获得控制器操作的绝对路径,就像我们从任何地方调用Response.Redirect("~/subfolder")或从我们的视图中调用@Url.Content("~/controller/action")一样。< / p>

在我的Global.asax事件中,我想做这样的事情:

protected void Application_BeginRequest(object sender, EventArgs args)
{
  if ( string.Compare(HttpContext.Current.Request.RawUrl, "~/foo", true) == 0 )
    // do something

    // I'd like the "~foo" to resolve to the virtual path relative to 
    // the application root
}

3 个答案:

答案 0 :(得分:6)

以下是answer for your problem

你可以简单地获得像这样的控制器和动作名称

protected void Application_BeginRequest(object sender, EventArgs args)
{
    HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current);
    UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
    RouteData routeData = urlHelper.RouteCollection.GetRouteData(currentContext);
    string action = routeData.Values["action"] as string;
    string controller = routeData.Values["controller"] as string;

  if (string.Compare(controller, "foo", true) == 0)
    // do something

    // if the controller for current request if foo
}

答案 1 :(得分:0)

最好创建一个ActionFilterAttribute并覆盖OnActionExecuting方法,如下所示:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.ActionName == "Foo") 
    {
        // do something
    }
    base.OnActionExecuting(filterContext);
}

然后,您可以在BaseController上应用该属性,例如。

答案 2 :(得分:0)

如何检查会话超时

void Session_Start(object sender, EventArgs e)
{
    if (Session.IsNewSession && Session["SessionExpire"] == null)
    {
        //Your code
    }
}

您有很多选择可以做到这一点。但我不建议使用Global.asax位置进行此类比较

选项 - 1

这也是非常重要的方法。您可以使用HttpModule

选项 - 2

Base Controller class

选项 - 3

您可以将动作过滤器应用于整个Controller类,如下所示

namespace MvcApplication1.Controllers
{
     [MyActionFilter]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               return View();
          }

          public ActionResult About()
          {

               return View();
          }
     }
}

每当调用Home控制器公开的任何操作时 - Index()方法或About()方法,Action Filter类将首先执行。

namespace MvcApplication1.ActionFilters
{
     public class MyActionFilter : ActionFilterAttribute
     {
          public override void OnActionExecuting(ActionExecutingContext filterContext)
          {
                 //Your code for comparison
          }    
     }
}

如果你注意上面的代码,OnActionExecuting将在执行Action Method之前执行

选项 - 4

使用此方法将仅为Index方法执行OnActionExecuting

namespace MvcApplication1.Controllers
{
     public class DataController : Controller
     {
          [MyActionFilter]
          public string Index()
          {
                 //Your code for comparison    
          }
     }
}

如何获取当前请求DataTokens

RouteData.Values["controller"] //to get the current Controller Name
RouteData.Values["action"]     //to get the current action Name