首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多个操作结果执行的MVC3操作过滤器属性

具有多个操作结果执行的MVC3操作过滤器属性
EN

Stack Overflow用户
提问于 2011-06-15 18:15:15
回答 3查看 1.2K关注 0票数 0

我想知道是否有可能因为一个动作过滤器而执行一些动作结果。

几个动作结果的filterContext.Result=execution

我的问题是,我必须根据一些用户凭证或我的操作的一个视图+一个RenderPartial呈现我的操作的视图。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-15 20:37:55

解决方案比我预期的要简单得多:

首先创建一个多操作结果类,该类是包含带有ActionResults的IEnumerable的ActionResult的包装器

代码语言:javascript
运行
复制
/// <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;
    }
}

其次,您可以创建一个筛选器,以便将set filterContext.Result返回到此PortalMultipleActionResult的一个实例。

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

票数 0
EN

Stack Overflow用户

发布于 2011-06-15 18:20:38

您可以设置filterContext,使其导航到另一个动作/视图。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2011-06-15 18:20:55

这不应该在过滤器中完成,这类决策应该在控制器中完成,渲染应该在视图中完成。在已经生成的html中注入部分结果将是困难的,并且很难维护。制作一个ViewModel示例

代码语言:javascript
运行
复制
public class MyViewModel
{
    Model SomeBaseModel; //whatever model is needed for base information
    bool ShouldRenderPartial; //this point is important
}

在控制器中,根据凭据将shouldRenderPartial设置为true或false。在视图中(假设您使用的是razor语法)

代码语言:javascript
运行
复制
@if(Model.ShouldRenderPartial){
    @{Html.RenderPartial("PartialViewName")}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6356184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档