你如何跳跃'从MVC ViewComponent到另一个控制器?

时间:2017-10-25 01:39:34

标签: asp.net-core-mvc

我有一个简单的场景,如果购物车是空的,我想重定向到另一个页面'(控制器),说明购物车是空的或只是将它们发回商店

继承我的代码:

   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 但这里没有。

我认为主要的问题是我需要退出或返回一个Cartitems而我无法找到两种方法。

在好日子里,response.redirect("Empty.aspx")很简单,但现在一切都变得更容易了。在MVC中,做最简单的事情需要数天的研究。

2 个答案:

答案 0 :(得分: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时执行重定向(如果需要)。我会留给你:)

答案 1 :(得分: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)的属性,并将该属性应用于需要根据购物车状态进行不同操作的方法。然后,您将条件逻辑放在一个位置(此属性),您可以在整个应用程序中重复使用它。与@ shyju的方法类似,但不是重定向,只需从此方法返回适当的操作的true / false。