关于如果实体中的属性具有特定值,全局重定向到页面的最佳方法,我有一个相当简单的问题。 例如,如果您有一个简单的游戏并希望每个用户都有一个角色实体,但在可以访问任何特定的游戏路线之前,需要创建角色(例如姓名,性别等)。 我以为你可以简单地为此创建一个属性bool(Created / not created)。

更具体地说,我的问题是,如果角色具有“未创建”属性但是不做任何其他操作,如何从所有页面重定向到“CreateCharacter”控制器中的“索引”。

我已经尝试使用自定义动作过滤器并将其注册为全局过滤器,但它非常不稳定,只是生成一个无限循环。 我在这里找不到任何明显的简单解决方案吗?

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    using (var dbCtx = new ApplicationDbContext())
    {
        var character = HttpContext.Current.GetCharacter(dbCtx);
        if (character == null)
        {
            base.OnActionExecuting(filterContext);
            return;
        }

        if (character.IsCreated)
        {
            base.OnActionExecuting(filterContext);
            return;
        }

        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary(new {controller = "CreateCharacter", action = "Index"})
            );

        filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
        base.OnActionExecuting(filterContext);
    }
}

如果使用自定义过滤器是完全错误的想法,我会喜欢学习替代品。

===============>>#1 票数:0 已采纳

您正在获得无限循环,因为即使用户转到CreateCharacter控制器的Index操作,您也应用相同的逻辑。

您的方法在我看来非常合理,只需调整您的代码,以便在当前操作完全是目标时不重定向用户:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var actionName = filterContext.ActionDescriptor.ActionName;
    var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName

    if(controllerName == "CreateCharacter" && actionName == "Index")
    {
        base.OnActionExecuting(filterContext);
        return;
    }

    using (var dbCtx = new ApplicationDbContext())
    {
        var character = HttpContext.Current.GetCharacter(dbCtx);
        if (character == null)
        {
            base.OnActionExecuting(filterContext);
            return;
        }

        if (character.IsCreated)
        {
            base.OnActionExecuting(filterContext);
            return;
        }

        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary(new {controller = "CreateCharacter", action = "Index"})
            );

        filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
        base.OnActionExecuting(filterContext);
    }
}

  ask by Maddnias translate from so

未解决问题?本站智能推荐: