目标
停止由动作产生的无限循环。
问题
我有一个商店应用程序。产品属于类别,可以标记为优惠。有一个左侧菜单列出我的应用程序的类别(如Clothing、Shoes、Caps等)。此菜单的一项是Offers
,但Offers
不是类别,它只是一个标志。任何物品都可以在供品“类别”中,但鞋子不能在帽子中。
如果我访问myapp.com/Category/Shoes/
,只会向我显示鞋子。如果我访问myapp.com/Category/Daily-Offers/
,今天的交易将显示给我 - 优惠可以是鞋子、帽子、衣服。
如您所见,在这两种情况下(鞋子或每日优惠),用户都会遇到Category
路线,但控制器不同。看看我的App_Start > RouteConfig.cs
:
routes.MapRoute(
name: "Categories",
url: "Category/{categoryName}",
defaults: new { controller = "Products",
action = "Category",
categoryName = UrlParameter.Optional
}
);
现在,我的ProductsController
:
[HttpGet]
public ActionResult Category(string categoryName = null)
{
int? categoryId =
(categoryName != "Daily-Offers") ?
Convert.ToInt32(Regex.Match(categoryName, @"\d+").Value) :
(int?)null;
if (categoryName == "Daily-Offers")
{
return RedirectToAction("DailyOffers", "Category");
}
else if (Regex.Match(categoryName, @"\d+").Success && String.Format("{0}-{1}",
categoryId,
CommodityHelpers.UppercaseFirst
(CommodityHelpers.GenerateSlug
(Categories.GetDetails((sbyte)categoryId).Category_Name)))
== categoryName)
{
[...]
return View(Products.BuildListForHome(categoryId, null));
}
else
{
return View("404");
}
}
正如您所看到的,有一个“如果”指向正确控制器的“每日优惠”。
该DailyOffers
方法来自ProductsController
:
[HttpGet]
public ActionResult DailyOffers()
{
var productsList = Products.BuildOffersList();
ViewBag.Title = String.Format("Today's deal ({0})", DateTime.Now);
ViewBag.CategoryProductsQuantity = productsList.Count;
ViewBag.CurrentCategory = "Daily-Offers";
return View(productsList);
}
最后,当我访问时myapp.com/Category/Daily-Offers
,响应是一个无限循环。是的,原因是合乎逻辑的,但是有什么方法可以防止这种情况呢?有人知道如何解决它吗?
我已经尝试过的
我已经用以下方法装饰了DailyOffers
' 方法:
[ActionName("Daily-Offers")]
但没有成功——再次无限循环。
强调
每日优惠不是一个类别——它是一个标志。该应用程序将优惠视为一个类别,但在数据库中有一个名为产品的列,onSale
它告诉您一个项目是否是一个优惠。