Действие MVC 3 по умолчанию без использования MapRoute? - PullRequest
0 голосов
/ 09 марта 2012

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

 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
    }
 );

И чтобы он вызывал "DefaultController" по умолчанию ... по умолчанию без необходимости указывать его в аргументе по умолчанию MapRoute.

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

1 Ответ

3 голосов
/ 09 марта 2012

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

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

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

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

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


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 }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...