0

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

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 中的路由是电子逻辑的。

帮助?!

4

1 回答 1

2

搜索路由时,将使用与您的 URL 匹配的第一个路由。AdminUpdateCategoryView将匹配任何管理控制器和操作。您提供了“”的默认 cid,但这无关紧要,因为您要求 cid 是一个低于该数字的数字。AdminCategoryListView将匹配进入 main 的任何 url。因为您提供的默认页面为 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
于 2012-05-12T02:25:41.923 回答