2016-05-24 4 views
1

エンティティのプロパティが特定の値を持つ場合、ページにグローバルにリダイレクトする最良の方法について、かなり簡単な質問があります。たとえば、単純なゲームを持ち、すべてのユーザーにキャラクタエンティティを持たせたいが、特定のゲームルートにアクセスする前に、そのキャラクタを作成する必要があります(例:名前、性別など)。私は、あなたが単にこれに対してプロパティbool(Created/not created)を持つことができたと考えていました。ASP.NETエンティティがグローバルに設定されたプロパティを持つ場合、ページにリダイレクト

私の質問は、文字が「作成されていません」プロパティを持っていても、それ以外の場合は何もしない場合、「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); 
    } 
} 

カスタムフィルタを使用している場合、これについて間違った考えがある場合は、代替案を習得したいと思います。

答えて

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); 
    } 
} 
関連する問題