Asp.Net Routing с разными именами параметров - PullRequest
3 голосов
/ 12 июля 2011

Я пытаюсь отобразить определенные маршруты, чтобы автоматически сгенерированные URL-адреса выглядели как Admin/controller/action/param для обоих этих блоков кода, @Url.Action("action","controller",new{id="param"}) и @Url.Action("action","controller",new{type="param"})

.регистрация области,

context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", 
                  id = UrlParameter.Optional }, 
            new string[] { "namespaces" });

        context.MapRoute(
            "Admin_type",
            "Admin/{controller}/{action}/{type}",
            new { action = "Index", 
                  type = UrlParameter.Optional }, 
            new string[] { "namespaces" });

, когда имя параметра id, сгенерированный URL-адрес, как и ожидалось, но когда имя параметра type вместо controller/action/typevalue, оно генерирует что-то вроде controller/action/?type=typevalue

Можно ли сгенерировать URL-адрес, например controller/action/typevalue, сохраняя поведение генератора для Admin_default маршрута без изменений?

Ответы [ 3 ]

5 голосов
/ 13 июля 2011

когда имя параметра равно id, сгенерированный URL-адрес соответствует ожидаемому, но когда имя параметра тип, а не контроллер / действие / тип значения, это генерирует что-то вроде контроллера / действия /? type = typevalue

Это происходит потому, что для сопоставления URL используется первый маршрут (идентификатор необязательный).

Вы можете попробовать добавить некоторые ограничения в ваши маршруты. Я предполагаю, что ваш параметр id является целым числом, а параметр типа является строкой. В этом случае вы можете попробовать следующие маршруты:

context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }, 
                new { id = @"\d+" },    
                new string[] { "namespaces" });

context.MapRoute(
                "Admin_type",
                "Admin/{controller}/{action}/{type}",
                new { action = "Index", type = UrlParameter.Optional }, 
                new string[] { "namespaces" });

Вы можете найти больше информации об ограничениях маршрута здесь .

2 голосов
/ 13 июля 2011

Вы пытались удалить опциональное значение по умолчанию для идентификатора?В этом случае первый маршрут не должен совпадать, если указан только параметр типа.

РЕДАКТ.

0 голосов
/ 13 июля 2011

Вам нужен только один маршрут.

context.MapRoute("Admin_default",             
         "Admin/{action}/{id}",            
         new { action = "Index",                    
         id = UrlParameter.Optional },              
        new string[] { "namespaces" }); 

в вашем контроллере вы

URL: http://website/Admin/index/hello

http://website/Admin/type/342

public class AdminController()
{
   public ActionResult Index(string id)
   {
     // do whatever
     returne View();
   }

   public ActionResult type(string id)
   {
     // do whatever
     returne View();
   }

}
...