目標
アクションによって発生する無限ループを停止します。
問題
ストアアプリケーションがあります。製品はカテゴリにあり、オファーとしてマークできます。アプリケーションのカテゴリ ( Clothing、Shoes、Capsなど)を一覧表示する左側のメニューがあります。このメニューの 1 つの項目は ですが、カテゴリではなく、単なるフラグです。どのアイテムもオファリングの「カテゴリ」に含めることができますが、靴はキャップにすることはできません。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");
}
}
ご覧のとおり、正しいコントローラーの「Daily-Offers」を指す「if」があります。
からの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
、アイテムがオファーであるかどうかを示す、製品と呼ばれる列があります。