我想知道是否有可能因为一个动作过滤器而执行一些动作结果。
几个动作结果的filterContext.Result=execution
我的问题是,我必须根据一些用户凭证或我的操作的一个视图+一个RenderPartial呈现我的操作的视图。
发布于 2011-06-15 20:37:55
解决方案比我预期的要简单得多:
首先创建一个多操作结果类,该类是包含带有ActionResults的IEnumerable的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;
}
}其次,您可以创建一个筛选器,以便将set filterContext.Result返回到此PortalMultipleActionResult的一个实例。
最后,只需将过滤器添加到控制器的操作方法中。
发布于 2011-06-15 18:20:38
您可以设置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。
发布于 2011-06-15 18:20:55
这不应该在过滤器中完成,这类决策应该在控制器中完成,渲染应该在视图中完成。在已经生成的html中注入部分结果将是困难的,并且很难维护。制作一个ViewModel示例
public class MyViewModel
{
Model SomeBaseModel; //whatever model is needed for base information
bool ShouldRenderPartial; //this point is important
}在控制器中,根据凭据将shouldRenderPartial设置为true或false。在视图中(假设您使用的是razor语法)
@if(Model.ShouldRenderPartial){
@{Html.RenderPartial("PartialViewName")}
}https://stackoverflow.com/questions/6356184
复制相似问题