2011-03-13 27 views
2

重定向到操作方法我做了一個自定義訪問檢查ActionFilterAttribute,如果它們沒有足夠的訪問權限,我想重定向到錯誤頁面。這是我到目前爲止。ActionFilterAttribute使用參數

RouteValueDictionary routeValues = new RouteValueDictionary(new { 
       action = "Error", 
       controller = "Home", 
       error = new Error(HttpStatusCode.Unauthorized, "You do not have sufficient access to complete your request.", (HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : ""), DateTime.Now) 
      }); 
      filterContext.Result = new RedirectToRouteResult(routeValues); 

以下是錯誤頁面動作方法

public ActionResult Error(Error error) 

然而,當路由重定向到操作方法,在「錯誤」 paramater爲空,我怎麼做這個沒有paramater是空?

回答

5

重定向時無法傳遞複雜的對象參數。您可以傳遞它的組成屬性,並讓默認模型綁定器完成重構它的工作。因此,假如你有以下型號:

public class Error 
{ 
    public string Message { get; set; } 
    public HttpStatusCode Status { get; set; } 
    public string UserHost { get; set; } 
    public DateTime Date { get; set; } 
} 

,你可以這樣重定向:

var routeValues = new RouteValueDictionary(new 
{ 
    action = "Error", 
    controller = "Home", 

    Message = "You do not have sufficient access to complete your request.", 
    Status = HttpStatusCode.Unauthorized, 

    // Remark: never use HttpContext.Current : 
    UserHost = filterContext.HttpContext.Request.UserHostAddress, 

    Date = DateTime.Now.ToString("u") 
}); 
filterContext.Result = new RedirectToRouteResult(routeValues); 

而且處理的授權,我建議你寫一個自定義AuthorizeAttribute,而不是一個自定義ActionFilterAttribute的。它在語義上更加正確。

1

您的問題是由於以下原因導致的:在聲明路由時(通常在global.asax(.cs))中,HttpContext.Current爲空ALOWS!所以這個動作總是會收到一個null作爲錯誤參數。

試圖改變你的代碼是這樣的:

    在Global.asax中
  • (的.cs)宣佈只在它的控制器和行動路線。這對於路線來說已經足夠了。
  • 在Home controller的Error()動作中,定義顯示您需要的「拒絕訪問」消息的代碼(通常通過返回Content(「拒絕訪問的消息到此處」)完成)。
  • 如果您的操作篩選器能夠成功重定向到此路線,則應該沒問題。

希望這有助於!

順便說一下,你可以直接從Action Filter中返回你需要的ActionResult - 所以不是重定向到Error操作(我想使用Redirect或者RedirectToAction),你可以直接返回Content(「access denied message goes here 「)。

其中任何一個都可以正常工作。

相關問題