0

目標

アクションによって発生する無限ループを停止します。

問題

ストアアプリケーションがあります。製品はカテゴリにあり、オファーとしてマークできます。アプリケーションのカテゴリ ( ClothingShoesCapsなど)を一覧表示する左側のメニューがあります。このメニューの 1 つの項目は ですが、カテゴリではなく、単なるフラグです。どのアイテムもオファリングの「カテゴリ」に含めることができますが、靴はキャップにすることはできません。OffersOffers

にアクセスする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、アイテムがオファーであるかどうかを示す、製品と呼ばれる列があります。

4

1 に答える 1

3

あなたのルートテーブルは のみを知っている/Category/{categoryName}ので、あなたのアクション/Category/Daily-Offersにヒットします。Category

既存のカテゴリ マッピングの上に、デイリー オファー アクションの新しいマッピングを追加できます。

routes.MapRoute(
   name: "DailyOffers",
   url: "Category/Daily-Offers",
   defaults: new { controller = "Products", 
                   action = "DailyOffers"
                 }
);

routes.MapRoute(
   name: "Categories",
   url: "Category/{categoryName}",
   defaults: new { controller = "Products", 
                   action = "Category", 
                   categoryName = UrlParameter.Optional 
                 }
);
于 2013-06-17T12:16:06.837 に答える