动作故障的无限循环解决方案

时间:2013-06-17 12:08:34

标签: c# asp.net-mvc-4 razor

目标

停止动作产生的无限循环。

问题

我有一个商店申请。产品属于类别,可以标记为商品。有一个左侧菜单列出我的应用程序的类别(例如服装 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");
    }
}

正如您所看到的,有一个“if”指向正确控制器的“Daily-Offers”。

来自DailyOffers的{​​{1}}方法:

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")] 的商品,可以告诉您商品是否为商品。

1 个答案:

答案 0 :(得分: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 
                 }
);