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