6

無論發生什麼ActionExecutingContext上的取消屬性?在使用ActionFilterAttribute時如何中止RenderAction,或者是否有另一種方法來爲這隻貓蒙皮?ActionFilterAttribute:'取消'屬性在哪裏?

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    if(!filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
    return; 
    } 
    base.OnActionExecuting(filterContext); 
    } 

上述代碼繼續儘管離開OnActionExecuting操作來執行它已經被應用到在操作?

---繼原帖: 感謝下面的答案,不過,我不認爲我所做的上下文很清楚,我想無效以下電話:

<% Html.RenderAction("Menu", "Shared", new { id = Model.OtherUserId }); %> 

當用戶未通過身份驗證時,此操作不會返回任何內容,我可以很容易地在視圖上放置一個'if'塊,但是,我想將規則保留在控制器中。

+0

查看我對渲染操作的更新。 – 2010-01-26 12:41:23

回答

3

不,您不能從操作過濾器中取消渲染。有很多原因,你不應該那樣做。客戶會看到什麼?錯誤頁面?沒有?

我想你正在構建一個授權操作過濾器,如果你沒有登錄就會渲染其他東西。如果你沒有登錄,框架中已經有一個(AuthorizeAttribute)重定向你登錄頁面。它們在框架中執行的方式是更改正在執行的結果(filterContext.Result = [[new result]];)。如果你不喜歡它的工作方式,你可以建立你自己的實現。

如果您仍然需要取消渲染或類似的東西,您將需要構建自己的ActionResult並在Execute方法中執行所需的任何邏輯。

- 更新 -

如果你想使用渲染動作,你應該只是把邏輯控制器,如果你沒有登錄返回空結果(有一個叫做「EmptyResult一個作用的結果「在框架中)。這種邏輯屬於控制器行爲。

14

這很好工作馬蒂亞斯的結果是這樣的:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new EmptyResult(); 
      return; 
     } 
     base.OnActionExecuting(filterContext); 
    } 
+0

但控制器操作方法內的代碼仍在執行? – Alex 2014-09-09 21:59:31

+0

OnActionExecuting在執行操作方法之前發生:http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.onactionexecuting(v=vs.118).aspx – rjarmstrong 2014-09-11 07:54:30

0

馬蒂亞斯和rjarmstrong已經anwswer問題。以下是過濾器和控制器的完整代碼:

public class CancelFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //before execution 
     var id = filterContext.RequestContext.HttpContext.Request.Params["id"]; 
     if (id == "0") 
     { 
      filterContext.Result = new EmptyResult(); 
      return; 
     } 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     //after execution 
    } 
} 


[CancelFilter] 
public class HomeController : Controller 
{ 
    public ActionResult DoSome(string id) 
    { 
     return View(); 
    } 

    ... 
}