Asp.net MVC区域中的多路径注册

时间:2016-10-21 09:49:25

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

我有一个名为Admin的区域,在AdminAreaRegistration中我定义了像打击一样的路线:

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

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new {Controller="Home", action = "Index", id = UrlParameter.Optional }
        );
        context.MapRoute(
         name: "Product",
          url: "Admin/ProductForm-{FormName}",
         defaults: new { controller = "ProductForm", action = "Index", id = UrlParameter.Optional }
     );
    }
}

并在ProductFormController(在Admin区域内)我有:

 public ActionResult Index(string FormName)
    {
        return View();
    }

如果我想转到此网址:http://localhost:5858/Admin/ProductForm-mobile,它应该转到Index中的ProductFormController操作(使用FormName = mobile),但事实并非如此。有什么问题?

1 个答案:

答案 0 :(得分:2)

在ASP.NET MVC中,路由机制以非常简单的方式工作,在第一个匹配时将重定向到该模式,忽略即将到来的模式。这就是为什么默认路线应该始终是最后一个。

您需要将"Admin_defaut"路线移至最后。

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {Controller="Home", action = "Index", id = UrlParameter.Optional }
    );
    context.MapRoute(
     name: "Product",
      url: "Admin/ProductForm-{FormName}",
     defaults: new { controller = "ProductForm", action = "Index", id = UrlParameter.Optional }
    );
}

正确实施:

public override void RegisterArea(AreaRegistrationContext context) 
{
    context.MapRoute(
        name: "Product",
        url: "Admin/ProductForm-{FormName}",
        defaults: new { controller = "ProductForm", action = "Index", id = UrlParameter.Optional }
     );

    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new {Controller="Home", action = "Index", id = UrlParameter.Optional }
    );
}