Несколько маршрутов по умолчанию в ASP.NET MVC для различных действий по умолчанию - PullRequest
4 голосов
/ 26 мая 2010

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

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

List() 
Draw()
ViewSingle() 

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

/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" } 

Справка?

Ответы [ 2 ]

3 голосов
/ 26 мая 2010

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

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 голос
/ 26 мая 2010

Я согласен с Нарсилом. Вы должны написать константу в 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" } 
...