我想知道是否可以通过动作过滤器执行一些动作结果。
filterContext.Result =执行一些行动结果
我的问题是我必须根据一些用户凭据或我的操作的一个视图+一个RenderPartial渲染我的操作视图到这个视图中。
答案 0 :(得分: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;
}
}
在上面的例子中,我正在设置过滤器上下文,以便在重新调整时,用户将被导航到Login / Index视图。
使用此代码,它应该类似于ActionFilters / GlobalFilters。
答案 1 :(得分: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")}
}
答案 2 :(得分:0)
我预期的解决方案更容易:
首先创建一个多动作结果类,它是ActionResult的包装器,包含带有ActionResults的IEnumerable
/// <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;
}
}
其次,您可以创建一个Filter,以便将set filterContext.Result返回到此PortalMultipleActionResult的一个实例。
最后,只需将过滤器添加到控制器的操作方法中。