我有一个简单的场景,如果购物车是空的,我想重定向到另一个页面'(控制器),说明购物车是空的或只是将它们发回商店
继承我的代码:
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中,做最简单的事情需要数天的研究。
答案 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。