2010-05-26 4 views
4

У меня есть несколько контроллеров с разными действиями (без действий «Index»). Действия, которые я считаю «дефолтными» действиями, называются по-разному. Я хочу создать маршруты по умолчанию для своих имен и иметь первое доступное действие (из моего списка действий по умолчанию), выполненное, если в маршруте указано только имя контроллера.Несколько маршрутов по умолчанию в ASP.NET MVC для разных действий по умолчанию

Так, к примеру, у меня есть следующие действия, которые я хочу рассмотреть по умолчанию и хотите проверить на их существование в контроллере в следующем порядке:

List() 
Draw() 
ViewSingle() 

Маршрутизация должна каким-то образом искать/{ контроллер}, а затем принять первое доступное действие из приведенного выше списка в качестве действия по умолчанию, например:

/ControllerA  -> ControllerA.List() 
/ControllerB  -> ControllerB.Draw() 
/ControllerC  -> ControllerC.ViewSingle() 
/ControllerD  -> ControllerD.Draw() 
/ControllerE  -> ControllerE.List() 

Возможно ли это? Я попытался создать дополнительные действия по умолчанию, подобные этому, но не смог заставить его работать:

routes.MapRoute("Default1", "{controller}/{action}", 
new { controller = UrlParameter.Optional, action = "List" } 

routes.MapRoute("Default2", "{controller}/{action}", 
new { controller = UrlParameter.Optional, action = "Draw" } 

routes.MapRoute("Default3", "{controller}/{action}", 
new { controller = UrlParameter.Optional, action = "ViewSingle" } 

Помощь?

+0

Зачем вы хотите это сделать? –

ответ

3

Я думаю, что у вас что-то не так в маршруте по умолчанию. Эти параметры контроллера и действия доступны для согласования. Если URL-адрес имеет имя контроллера в нем, он направит соответствующий контроллер. То же самое относится и к методам индекса. Он просто предоставляет значение по умолчанию для этого. Они уже являются необязательными, и именно поэтому. Я думаю, что вам не нужны маршруты здесь: Вы могли бы попытаться разместить свои функции по умолчанию в методах индекса, и было бы work.Just быть ясно:

public class ControllerA:Controller 
{ 
    public ActionResult Index() 
    { 
     return List(); 
    } 

    public ActionResult List() 
    { 
    //List function 
    } 
} 


public class ControllerB:Controller 
{ 
    public ActionResult Index() 
    { 
     return Draw(); 
    } 

    public ActionResult Draw() 
    { 
    //Draw function 
    } 
} 

Я думаю, что это будет работать. Но если вы хотите идти с созданием маршрутов, вы создаете каждый маршрут, как это:

routes.MapRoute("Default1", "ControllerA", 
new { controller = ControllerA, action = "List" } 

Обратите внимание, что ControllerA не находится в фигурных скобках, это статический текст. Таким образом, вы создаете маршруты для каждого контроллера. Соблюдайте правила именования контроллеров.

1

Я согласен с Narsil. Вы должны написать константу для URL. как имя контроллера - потому что MVC не может разрешить эти маршруты и не может понять, что вы хотите показать.

например.

routes.MapRoute(null, "ControllerA/{action}", 
new { controller = "ControllerA", action = "List" } 

routes.MapRoute(null, "ControllerB/{action}", 
new { controller = "ControllerB", action = "Draw" } 

routes.MapRoute(null, "ControllerC/{action}", 
new { controller = "ControllerC", action = "ViewSingle" } 
Смежные вопросы