路由区域和参数不一,误会

时间:2012-05-11 20:40:15

标签: asp.net-mvc-3 routing

我整天都很困惑,我在区域有路由,看起来像这样。

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRouteLowercase(null, "Account/{action}",
                                  new {controller = "Account"},
                                  new {action = @"LogOff|LogOn|Create|Update|Delete|List"},
                                  new[] {"WebUI.Areas.Admin.Controllers"});

        context.MapRouteLowercase( //this works
            "AdminUpdateCategoryView",
            "admin/{controller}/{action}/{cid}",
            new {area = "admin", controller = "Main", action = "UpdateCategory", cid = ""},
            new {cid = @"\d+"},
            new[] {"WebUI.Areas.Admin.Controllers"}
        );

        context.MapRouteLowercase(//this not works
            "AdminCategoryListView",
            "admin/Main/{action}/{page}",
            new { action = "Category", page = "1" },
            new {page = @"\d+"},
            new[] {"WebUI.Areas.Admin.Controllers"}
        );

        context.MapRouteLowercase(
            "Admin_Default", // Route name
            "admin/{controller}/{action}/{id}", // URL with parameters
            new {controller = "Category", action = "Index", id = UrlParameter.Optional} // Parameter defaults
        );
    }
}

我写过哪些有效,哪些无效,但是如果它们之间的变化不起作用,那么它起作用,另一个起作用,那就不起作用了吗?

示例:

first case-> /admin/main/updatecategory/1 --> works 
             /admin/main/category/1       --> not works
             result: /admin/main/category/1?page=1

second case-> /admin/main/category/1 --> works
              /admin/main/updatecategory/1 --> not works
              result: /admin/main/updatecategory/1?cid=1

这是我的控制器操作:

public ActionResult Category(int? page)
    {
        int pageIndex = page.HasValue ? page.Value : 1;
        return View("Category", CategoryViewModelFactory(pageIndex));
    }

    public ActionResult CreateCategory()
    {
        return View();
    }

    public ActionResult UpdateCategory(int cid)
    {
        return View();
    }

    public ActionResult DeleteCategory(int? cid)
    {
        return View();
    }

这是什么问题以及如何解决?

我很困惑,ASP.MVC3中的路由是电子逻辑。

帮助?!

1 个答案:

答案 0 :(得分:2)

搜索路线时,会使用与您的网址匹配的第一条路线。 AdminUpdateCategoryView将匹配任何管理员控制器和操作。你提供了一个默认的cid“”,但这并不重要,因为你要求cid是一个低于它的数字。 AdminCategoryListView将匹配任何进入main的网址。因为您提供的默认页面为1,所以如果没有提供页面则无关紧要。

因此,如果AdminCategoryListView位于顶部:admin / main中的每个路由都将使用此路由。 如果AdminUpdateCategoryView位于管理员到达此路由且具有数字cid值参数的每条路径上,则会使用它。

我建议将AdminCategoryListView放在首位,因为这是更具体的路线。删除page="1"(取决于您是否要提供默认值),或将{action}替换为“类别”,以便其他路由不使用此路由。此外,您应该提供main的默认控制器,否则它将假设您当前使用的控制器是正确的。

context.MapRouteLowercase(
        "AdminCategoryListView",
        "admin/Main/category/{page}",
        new { action = "Category", controller = "Main" },
        new {page = @"\d+"},
        new[] {"WebUI.Areas.Admin.Controllers"}
    );

//Put AdminUpdateCategoryView here