我整天都很困惑,我在区域有路由,看起来像这样。
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中的路由是电子逻辑。
帮助?!
答案 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