2012-03-09 1 views
0

Мои требования состоят в том, чтобы иметь возможность сопоставлять пользовательский контроллер, но он встроен в него, что можно вызвать только одно действие. Таким образом, вместо этого:MVC 3 действие по умолчанию без использования MapRoute?

context.MapRoute(
    "RouteName", 
    "{controller}/{id}", 
    new { 
     controller = "MyCustomController", 
     action = "DefaultAction", <- I want to remove this. 
     id = UrlParameter.Optional 
    } 
); 

Я хочу, чтобы это сделать:

context.MapRoute(
    "RouteName", 
    "{controller}/{id}", 
    new { 
     controller = "MyCustomController", 
     id = UrlParameter.Optional 
    } 
); 

И иметь его называют «» контроллера по умолчанию хорошо ... по умолчанию без указания объявить его в дефолтов аргумента MapRoute.

Любая помощь?

+1

Можете ли вы объяснить, почему это необходимо сделать ? Мы могли бы предложить лучшую альтернативу. – jgauffin

ответ

3

Вы не можете этого сделать. Ваш url не содержит токен {action}. Это означает, что вам абсолютно необходимо указать, какое действие вы хотите вызывать в значениях по умолчанию.

Поставьте себя на место двигателя маршрутизации. Вы видите следующий запрос: Home/123. Вы просматриваете определение маршрута, и вы видите {controller}/{id}.

Great => Теперь вы знаете, что можете создать экземпляр HomeController, но это все, что вы знаете, если действие не указано как значение по умолчанию. Вы не знаете, какое действие нужно вызвать на этом HomeController, и история заканчивается здесь.

Вы бросаете следующее исключение для разработчика, чтобы сообщить ему о проблеме с его кодом:

RouteData должен содержать элемент с именем «действие» с непустым значением строки.


UPDATE:

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

public static class RouteExtensions 
{ 
    public static Route MyMapRoute(this RouteCollection routes, string name, string url, object defaults) 
    { 
     var defaultValues = new RouteValueDictionary(defaults); 
     if (!defaultValues.ContainsKey("action")) 
     { 
      defaultValues["action"] = "index"; 
     } 
     var route = new Route(url, new MvcRouteHandler()) 
     { 
      Defaults = defaultValues, 
      Constraints = new RouteValueDictionary(), 
      DataTokens = new RouteValueDictionary() 
     }; 
     routes.Add(name, route); 
     return route; 
    } 
} 

и затем:

routes.MyMapRoute(
    "RouteName", 
    "{controller}/{id}", 
    new { controller = "MyCustomController", id = UrlParameter.Optional } 
); 
+0

Ну, мне было интересно, есть ли способ переопределить или расширить метод MapRoute, чтобы, когда они передавали свои значения по умолчанию, я могу скрыть свой DefaultAction за кулисами. – David

+0

@ Давид, конечно, это возможно. Я обновлю свой ответ, чтобы показать вам, как это сделать. –

+0

Это абсолютно пятно на! Огромное спасибо :) – David

Смежные вопросы