Asp.net mvc 3 MVC3区域路由冲突
问题:我希望我的路线是这样的 /管理员/main/category/1->1==?页面=1 我不想看到page=1 我的控制器Asp.net mvc 3 MVC3区域路由冲突,asp.net-mvc-3,exception,asp.net-mvc-routing,Asp.net Mvc 3,Exception,Asp.net Mvc Routing,问题:我希望我的路线是这样的 /管理员/main/category/1->1==?页面=1 我不想看到page=1 我的控制器 public class MainController : BaseController { private const int PageSize = 5; //pager view size [Inject] public ICategoryRepository CategoryRepository { get; set; } pu
public class MainController : BaseController
{
private const int PageSize = 5; //pager view size
[Inject]
public ICategoryRepository CategoryRepository { get; set; }
public ActionResult Index()
{
return View();
}
public ActionResult Category(int page)
{
//int pageIndex = page.HasValue ? page.Value : 1;
int pageIndex = page != 0 ? page : 1;
return View("Category", CategoryViewModelFactory(pageIndex));
}
/*
*Helper: private instance/static methods
======================================================================*/
private CategoryViewModel CategoryViewModelFactory(int pageIndex) //generate viewmodel category result on pager request
{
return new CategoryViewModel
{
Categories = CategoryRepository.GetActiveCategoriesListDescending().ToPagedList(pageIndex, PageSize)
};
}
}
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRouteLowercase(
"AdminCategoryListView",
"admin/{controller}/{action}/{page}",
new { controller = "Category", action = "Category", page = "1" },
new { id = @"\d+" },
new[] { "WebUI.Areas.Admin.Controllers" }
);
}
}
My Exception:
参数字典包含参数“page”的空条目
方法的不可为Null的类型“System.Int32”
中的“System.Web.Mvc.ActionResult类别(Int32)”
“WebUI.Areas.Admin.Controller.MainController”。可选参数
必须是引用类型、可为null的类型或声明为
可选参数。参数名称:参数
提前感谢大家。请确保在管理区域路由注册中定义了
{page}
路由令牌,而不是默认生成的{id}
:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{page}",
new { action = "Index", page = UrlParameter.Optional }
);
}
现在,在生成链接时,请确保指定以下参数:
@Html.ActionLink(
"go to page 5", // linkText
"category", // actionName
"main", // controllerName
new { area = "admin", page = "5" }, // routeValues
null // htmlAttributes
)
将发出:
<a href="/Admin/main/category/5">go to page 5</a>
当请求此url时,类别操作将被调用并传递
page=5
参数。+1谢谢,这已经成功了,但是我可以拥有多个“路线注册”吗?您可以拥有任意数量的路线注册。您只需要确保它们不冲突,并且路由引擎能够始终消除两者之间的歧义。例如,如果您有以下两个URL:Admin/{controller}/{action}/{page}
和Admin/{controller}/{action}/{id}
,给出一个url,如/admin/main/category/5
路由引擎无法消除两条路由之间的歧义,并且总是选择第一条路由。我用默认路由测试了你的路由建议,但它不起作用,在我删除默认路由后,它起作用了。它不使用默认路由是正常的。这是因为它们相互冲突,互不兼容。可以使用管线约束。例如,如果您知道{page}
始终是一个整数,{id}
始终是一个字符串,则可以使用以下正则表达式路由约束:page=@“\d+”
。要了解更多关于路由签出的信息,请阅读以下文章:我不知道您的要求是什么。例如,如果您的id只能包含[a-z]字符,并且您的页码只能是整数,那么您可以有两个路由:context.MapRoute(“Admin_默认”、“Admin/{controller}/{action}/{action}/{id}”、new{action=“Index”、id=urlparmeter.Optional}、new{id=@“[a-z]*”});MapRoute(“Admin_page”、“Admin/{controller}/{action}/{page}”、new{action=“Index”}、new{page=@“\d+”})代码>。但这一切都取决于您的确切应用要求。