【问题标题】:MVC3 Areas routing conflictMVC3 区域路由冲突
【发布时间】:2012-05-11 09:39:11
【问题描述】:

问题:我希望我的路线是这样的

/admin/main/category/1 -> 1 == ?page=1 我不想看到 page=1

我的控制器

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:

参数字典包含参数“页面”的空条目 方法的不可为空类型“System.Int32” 'System.Web.Mvc.ActionResult 类别(Int32)' 在 'WebUI.Areas.Admin.Controllers.MainController'。可选参数 必须是引用类型、可为空的类型或被声明为 可选参数。参数名称:参数

提前谢谢大家。

【问题讨论】:

    标签: asp.net-mvc-3 exception asp.net-mvc-routing


    【解决方案1】:

    确保在您的管理区域路由注册中定义了{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 时,将调用 Category 操作并传递page=5 参数。

    【讨论】:

    • +1 谢谢你已经成功了,但是我可以有多个“路线注册”吗?
    • 您可以有任意数量的路线注册。您只需要确保它们没有冲突,并且路由引擎能够始终在两者之间消除歧义。例如,如果您有以下 2 个 url:Admin/{controller}/{action}/{page}Admin/{controller}/{action}/{id},则提供一个类似 /admin/main/category/5 的 url,路由引擎无法区分这两条路由,显然总是会选择第一个。
    • 我已经用默认路由测试了你的路由建议,但它不起作用,在我删除默认路由后,它确实起作用了。
    • 默认路由不生效是正常的。原因是它们相互冲突和不兼容。您可以使用路线限制。例如,如果您知道{page} 将始终是一个整数而{id} 始终是一个字符串,您可以使用以下正则表达式路由约束:page=@"\d+"。要了解有关路由结帐的更多信息,请阅读以下文章:msdn.microsoft.com/en-us/library/cc668201.aspx
    • 我不知道你有什么要求。例如,如果您的 id 只能包含 [a-z] 字符并且您的页码只是整数,那么您可以有 2 条路由:context.MapRoute("Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new { id = @"[a-z]*" }); context.MapRoute("Admin_page", "Admin/{controller}/{action}/{page}", new { action = "Index" }, new { page = @"\d+" } );。但这一切都取决于您的确切应用要求。
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 2012-02-19
    • 1970-01-01
    • 2017-04-15
    • 2018-03-25
    • 2018-06-07
    • 2018-05-23
    • 2013-06-05
    相关资源
    最近更新 更多