5

对不起,基本问题。

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

在我的 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
}
4

3 回答 3

7

这是您问题的答案

您可以像这样简单地获取控制器和操作名称

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
}
于 2013-05-29T17:24:20.900 回答
1

如何检查会话超时

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

你有很多选择来做到这一点。但我不建议使用Global.asaxplace 进行此类比较

选项1

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

选项 - 2

Base Controller class

选项 - 3

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

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

使用这种方法将只执行OnActionExecutingfor Index 方法。

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
于 2013-05-29T17:16:58.733 回答
0

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

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

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

于 2013-05-29T17:00:11.820 回答