2017-10-25 4 views
0

私は、カートが空の場合、カートが空であることを示す別の「ページ」(コントローラ)にリダイレクトしたい、または単に店に戻す単純なシナリオがあります。MVC ViewComponentから他のコントローラにどのようにジャンプしますか?

HERESに私のコード:

public async Task<IViewComponentResult> InvokeAsync() 
    { 
     CartFunctions cartf = new CartFunctions(_logger, AppSettings, _httpContextAccessor); 
     Cart c = new Cart(); 
     c = cartf.GetShopingCart(); 

     if (c.CartItems == null) 
     { 
      // How do I get out of here to a differnet Controller  
     } 


     return View(c.CartItems); 

    } 

それは私ができるreturn RedirectToAction コントローラだったが、それはここでは利用できない場合。

私の主な問題は、私がカルテットを返すか、または両方を行う方法を見つけることができないと思います。

好きな日にはresponse.redirect("Empty.aspx")でシンプルでしたが、MVCではすべてが「より簡単」で、最も簡単なことを行うには数日間の研究が必要です。

+0

ここで、ビューコンポーネントをどのように呼び出していますか?どのページで特定のページにリダイレクトしたいのですか? – Shyju

+0

これは、含むページから呼び出されます。 @await Component.InvokeAsync( "Basket") – user964787

答えて

1

このリダイレクトは、ビューコンポーネントが理想的なオプションのようには聞こえません。ビューコンポーネントは、レンダリングの部分的な表示に理想的です。たとえば、カートコンポーネントの数やコンテンツをレンダリングするには、ビューコンポーネントを使用することをお勧めします。

あなたのケースでは、カートが空のときに別のアクション方法にリダイレクトする必要があります。そのためにアクションフィルタを作成することができます。アクションメソッドレベルまたはコントローラレベルで必要に応じて適用することができます。

public class CheckCartValues : ActionFilterAttribute 
{  
    public override void OnActionExecuting(ActionExecutingContext context) 
    {    
     if (yourIfConditionToCheckCartIsEmpty) 
     { 
      context.Result = 
       new RedirectToRouteResult(new RouteValueDictionary(new { 
               controller = "Shop", action = "index" })); 
     } 
     base.OnActionExecuting(context); 
    } 
} 

あなたは

[CheckCartValues] 
public class HomeController : Controller 
{ 
} 

は、あなたがShopControllerにそれを持っていないことを確認してくださいコントローラレベルでそれを適用することもできますし、無限のリダイレクトを取得します。必要に応じて現在の要求がShopControllerの場合は、リダイレクトを行わないようにアクションフィルタコードを更新することもできます。私はそれをあなたに任せます:)

0

属性を使用する場合は、ActionMethodSelectorAttribute https://msdn.microsoft.com/en-us/library/system.web.mvc.actionmethodselectorattribute.isvalidforrequest(v=vs.118).aspx#M:System.Web.Mvc.ActionMethodSelectorAttribute.IsValidForRequest(System.Web.Mvc.ControllerContext,System.Reflection.MethodInfo)から派生させることができます。

たとえば、CartStatus(bool isEmpty)という名前の属性を作成し、カートのステータスに応じて異なる動作をする必要があるメソッドに属性を適用できます。条件付きロジックが正確に1か所にあり(この属性)、アプリケーション全体で再利用できます。 @ shyjuのアプローチと似ていますが、リダイレクトの代わりに、適切なアクションに対してこのメ​​ソッドからtrue/falseを返します。

関連する問題