Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果实体具有全局设置的属性,则ASP.NET重定向到页面_C#_Asp.net_Entity Framework - Fatal编程技术网

C# 如果实体具有全局设置的属性,则ASP.NET重定向到页面

C# 如果实体具有全局设置的属性,则ASP.NET重定向到页面,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有一个相当简单的问题:如果实体中的属性具有特定值,那么全局重定向到页面的最佳方式是什么。例如,如果您有一个简单的游戏,并且希望每个用户都有一个角色实体,但在访问任何特定的游戏路线之前,需要创建角色(例如姓名、性别等)。我在想你可以简单地为它创建一个属性bool(已创建/未创建) 因此,更具体地说,我的问题是,如果角色具有“notcreated”属性,但不执行任何其他操作,如何从所有页面重定向到“CreateCharacter”控制器中的“Index” 我尝试过使用自定义动作过滤器并将其注册为全

我有一个相当简单的问题:如果实体中的属性具有特定值,那么全局重定向到页面的最佳方式是什么。例如,如果您有一个简单的游戏,并且希望每个用户都有一个角色实体,但在访问任何特定的游戏路线之前,需要创建角色(例如姓名、性别等)。我在想你可以简单地为它创建一个属性bool(已创建/未创建)

因此,更具体地说,我的问题是,如果角色具有“notcreated”属性,但不执行任何其他操作,如何从所有页面重定向到“CreateCharacter”控制器中的“Index”

我尝试过使用自定义动作过滤器并将其注册为全局过滤器,但它非常不稳定,只会生成一个无限循环。有没有什么明显的简单的解决办法我在这里遗漏了

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);
    }
}

如果使用自定义过滤器是完全错误的想法,我很想学习其他方法。

您将得到一个无限循环,因为即使用户转到
CreateCharacter
控制器的
索引
操作,您也在应用相同的逻辑

在我看来,您的方法非常合理,只要调整代码,使其在当前操作正是目标时不重定向用户:

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);
    }
}

您将获得一个无限循环,因为即使用户转到
CreateCharacter
控制器的
索引
操作,您也在应用相同的逻辑

在我看来,您的方法非常合理,只要调整代码,使其在当前操作正是目标时不重定向用户:

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);
    }
}