我想知道是否可以通過操作過濾器來執行少量操作結果。執行多個操作結果的MVC3操作過濾器屬性
filterContext.Result =幾actionresults
我的問題的執行,我必須使我的行動取決於一些用戶憑據或我的行動+一個的RenderPartial的一個視圖到這一觀點的看法。
我想知道是否可以通過操作過濾器來執行少量操作結果。執行多個操作結果的MVC3操作過濾器屬性
filterContext.Result =幾actionresults
我的問題的執行,我必須使我的行動取決於一些用戶憑據或我的行動+一個的RenderPartial的一個視圖到這一觀點的看法。
的解決方案是更爲容易的,我預計:
首先創建一個多作用的結果類,它是一個包含一個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的一個實例。
最後只需將過濾器添加到控制器的操作方法中即可。
可以設置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類似。
這不應該在過濾器中完成,那種決定應該在控制器中完成,渲染應該在視圖中完成。在已經生成的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")}
}
嗨,Archil,謝謝你的迴應。 我認爲在這個問題上,誰應該做這個工作的決定是分裂的。一方面我有一些安全的東西,可以通過一個動作過濾器來處理。另一方面,我有一些「邏輯視圖」取決於這種安全性。其實我有一個完全按照你的例子的實現,但我想知道這是否有任何「最佳實踐」。 謝謝。 迎接。 何塞。 – Jose3d 2011-06-15 10:37:24
嗨傑森,首先想到你的快速反應。 我不需要重定向到其他控制器+動作的用戶,我只需要顯示我的動作的正確的看法,也許它是一個RenderPartial(取決於用戶的安全憑據,爲此我想使用如果可能的話一個動作過濾器)如果沒有,我可以在控制器中完成這項工作,並在視圖中放置一個if(userdoesnthavecredentials)然後RenderPartial等。 乾杯。 何塞。 – Jose3d 2011-06-15 10:33:56
啊,不用擔心。我會在這裏保留我的回答,以防萬一它有用。如果有人反對,那麼我會很樂意刪除它。 – 2011-06-15 10:40:16
非常感謝,它完全有用。 何塞。 – Jose3d 2011-06-15 10:41:53