MVC3动作过滤器属性,执行多个动作结果

时间:2011-06-15 10:15:15

标签: c# asp.net-mvc

我想知道是否可以通过动作过滤器执行一些动作结果。

filterContext.Result =执行一些行动结果

我的问题是我必须根据一些用户凭据或我的操作的一个视图+一个RenderPartial渲染我的操作视图到这个视图中。

3 个答案:

答案 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的一个实例。

最后,只需将过滤器添加到控制器的操作方法中。