2012-11-09 32 views
6

我想將[FirstTime]屬性放在控制器函數上方,然後創建一個FirstTimeAttribute,該邏輯檢查用戶是否輸入了他的名字,如果他沒有,則將其重定向到/Home/FirstTime控制器函數上方的自定義屬性

所以不是這樣做的:

public ActionResult Index() 
{ 
    // Some major logic here 
    if (...) 
     return RedirectToAction("FirstTime", "Home"); 

    return View(); 
} 

我只想做:

[FirstTime] 
public ActionResult Index() 
{ 
    return View(); 
} 

這可能嗎?

回答

10

當然。這樣做

public class FirstTimeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.Session != null) 
     { 
      var user = filterContext.HttpContext.Session["User"] as User; 
      if(user != null && string.IsNullOrEmpty(user.FirstName)) 
       filterContext.Result = new RedirectResult("/home/firstname"); 
      else 
      { 
       //what ever you want, or nothing at all 
      } 
     } 
    } 
} 

,只是使用[FirstTime]屬性上的操作

+0

真棒,謝謝非常。添加了'filterContext.Result = new RedirectResult(...);'......之後,就像一個魅力一樣工作......'謝謝! – Gaui

+1

很高興我能幫到你。對不起,沒有添加到第一個地方;滑倒了我的想法(在其他方面工作) – Mihai

0

屬性代碼:

public class FirstTimeAttribute : ActionFilterAttribute, IActionFilter 
     { 
      public override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 
       if (string.IsNullOrEmpty(filterContext.HttpContext.Request[name])) 
       { 
        filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary 
              { 
               { "controller", "Home" }, 
               { "action", "FirstTime" }, 
               { "area", string.Empty } 
              }); 
       } 
      } 
    } 

用法:

[FirstTime] 
public ActionResult Index(string name) 
{ 
    return View(); 
} 
+0

實施IActionFilter是多餘的。 ActionFilterAttribute已經實現了這個接口,並且你的FirstTimeAttribute繼承自ActionFilterAttribute :) – Mihai