Дополнительные параметры маршрута и выбор действий - PullRequest
2 голосов
/ 16 февраля 2011

Я использую определение маршрута по умолчанию:

{controller}/{action}/{id}

, где id = UrlParameter.Optional. Насколько я понимаю, это означает, что когда id не является частью URL, это значение маршрута не будет существовать в словаре RouteValues.

Так что это также кажется вполне возможным (оба GET):

public ActionResult Index() { ... } // handle URLs: controller/action

public ActionResult Index(int id) { ... } // handle URLs: controller/action/id

Если id отсутствует, будет выполнено первое действие, но при наличии id будет выполнено второе. Хорошо, но не работает . Он не может разрешить действия.

Как мне это сделать?

Я подумываю написать атрибут селектора метода настраиваемого действия, например:

[RequiresRouteValue(string valueName)]

Это позволило бы использовать такие методы действий. Но это единственный способ сделать это?
Есть ли что-то встроенное, к чему я могу привязаться?

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Хорошо, за исключением того, что действие не может быть определено, довольно ясно, что действия разрешаются в первую очередь, затем связыватель данных входит в игру и проверяет параметры действия и пытается привязать к ним значения данных.Имеет смысл.

Это имеет смысл.Не было бы смысла сначала пытаться связать значения со всеми возможными типами и посмотреть, что мы получим, а затем искать соответствующее действие.Это было бы почти невозможно.

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

Вы можете прочитать все подробности и получить код в моем блоге:
Улучшение обслуживания Asp.net MVC и соответствие RESTful

1 голос
/ 16 февраля 2011

Используйте либо:

[HttpGet]
public ActionResult Index() { ... } // handle URLs: controller/action

[HttpPost]
public ActionResult Index(int id) { ... } // handle URLs: controller/action/id

Или просто один с обнуляемым параметром:

public ActionResult Index(int? id) { ... } // handles both instances

EDIT: Будет ли что-то вроде этой работы?

            routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/", // URL with parameters
            new { controller = "Login", action = "Index" } // Parameter defaults
        );

        routes.MapRoute(
            "DefaultWithValue", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Login", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
...