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.asaxそのような比較を行うために場所を使用することはお勧めしません

オプション1

これも非常に重要なアプローチです。使用できますHttpModule

オプション - 2

Base Controller class

オプション - 3

以下のように、Action Filter を 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 が実行されます。

オプション - 4

このアプローチを使用すると、OnActionExecutingfor Index メソッドのみが実行されます。

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

現在のリクエストの DataToken を取得する方法

RouteData.Values["controller"] //to get the current Controller Name
RouteData.Values["action"]     //to get the current action Name
于 2013-05-29T17:16:58.733 に答える