2011-06-15 95 views
0

我想知道是否可以通過操作過濾器來執行少量操作結果。執行多個操作結果的MVC3操作過濾器屬性

filterContext.Result =幾actionresults

我的問題的執行,我必須使我的行動取決於一些用戶憑據或我的行動+一個的RenderPartial的一個視圖到這一觀點的看法。

回答

0

的解決方案是更爲容易的,我預計:

首先創建一個多作用的結果類,它是一個包含一個IEnumerable與ActionResults的ActionResult的包裝

/// <summary> 
/// this class contains a batch of ActionResult to execute 
/// </summary> 
public class PortalMultipleActionResult : ActionResult 
{ 
    /// <summary> 
    /// Builds a new instance of PortalMultipleActionResult 
    /// </summary> 
    /// <param name="results"></param> 
    public PortalMultipleActionResult(IEnumerable<ActionResult> results) 
    { 
     Results = results; 
    } 

    /// <summary> 
    /// Builds a new instance of PortalMultipleActionResult 
    /// </summary> 
    /// <param name="actions"></param> 
    public PortalMultipleActionResult(IEnumerable<Action> actions) 
    { 
     Results = actions.Select(x => new PortalActionDelegateResult(x)); 
    } 

    /// <summary> 
    /// Batch execution of all the results 
    /// </summary> 
    /// <param name="context"></param> 
    public override void ExecuteResult(ControllerContext context) 
    { 
     foreach (var res in Results) 
     { 
      res.ExecuteResult(context); 
     } 
    } 

    /// <summary> 
    /// Action results collection 
    /// </summary> 
    private IEnumerable<ActionResult> Results 
    { 
     get; 
     set; 
    } 
} 

其次,你可以爲了創建一個過濾器,以返回設定filterContext.Result這個PortalMultipleActionResult的一個實例。

最後只需將過濾器添加到控制器的操作方法中即可。

1

可以設置filterContext使得其導航到另一個動作/視圖即

private static void SetRedirectToLoginPageForContext(AuthorizationContext filterContext) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
                   { 
                    { "controller", "Login" }, 
                    { "action", "Index" } 
                   }); 
     } 

public class UserAuthenticatedAction : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
      SetRedirectToLoginPageForContext(filterContext); 
      return; 
    } 
} 

在上面的例子中,我設置濾波器上下文,使得在重新調諧時,用戶將被導航到登錄/索引視圖。

請仔細閱讀此代碼,它應該與ActionFilters/GlobalFilters類似。

+0

嗨傑森,首先想到你的快速反應。 我不需要重定向到其他控制器+動作的用戶,我只需要顯示我的動作的正確的看法,也許它是一個RenderPartial(取決於用戶的安全憑據,爲此我想使用如果可能的話一個動作過濾器)如果沒有,我可以在控制器中完成這項工作,並在視圖中放置一個if(userdoesnthavecredentials)然後RenderPartial等。 乾杯。 何塞。 – Jose3d 2011-06-15 10:33:56

+1

啊,不用擔心。我會在這裏保留我的回答,以防萬一它有用。如果有人反對,那麼我會很樂意刪除它。 – 2011-06-15 10:40:16

+0

非常感謝,它完全有用。 何塞。 – Jose3d 2011-06-15 10:41:53

1

這不應該在過濾器中完成,那種決定應該在控制器中完成,渲染應該在視圖中完成。在已經生成的html中注入部分結果將會很難並且難以維護。做一個示例ViewModel

public class MyViewModel 
{ 
    Model SomeBaseModel; //whatever model is needed for base information 
    bool ShouldRenderPartial; //this point is important 
} 

在控制器中,根據憑據設置爲shouldRenderPartial true或false。並在視圖(假設你使用剃刀語法)

@if(Model.ShouldRenderPartial){ 
    @{Html.RenderPartial("PartialViewName")} 
} 
+0

嗨,Archil,謝謝你的迴應。 我認爲在這個問題上,誰應該做這個工作的決定是分裂的。一方面我有一些安全的東西,可以通過一個動作過濾器來處理。另一方面,我有一些「邏輯視圖」取決於這種安全性。其實我有一個完全按照你的例子的實現,但我想知道這是否有任何「最佳實踐」。 謝謝。 迎接。 何塞。 – Jose3d 2011-06-15 10:37:24