Маршрутизация ASP.Net MVC с командами действий HTTP

Я пишу реализацию веб-приложения ASP.NET, и когда я вызываю конкретный URL-адрес, я хочу вызвать другой метод действия в зависимости от того, является ли запрос GET или POST.

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

<HttpGet>
Public Function Index() as ActionResult
...
End Function

<HttpPost>
Public Function Index() as ActionResult
...
End Function

... а затем регистрация маршрута, который устанавливает .action в "Index" для URL-адреса. Это не компилируется, потому что две функции имеют одинаковую сигнатуру.

Затем я попытался изменить имя подпрограммы Post на «Subscribe», но, конечно, для этого мне потребовалось бы указать два разных маршрута в таблице маршрутизации (чтобы указать имя нового метода действия). Если я это сделаю, то обнаружу, что второй отменяется первым.

Теперь я подумываю вернуться к своей первоначальной идее, но предоставить ей фиктивный параметр и указать его как UrlParameter.Optional. Имея это в качестве аргумента в подпрограмме публикации, это создаст новую сигнатуру метода, что, как я ожидал, будет в порядке.

Хотя это немного пахнет грязным хаком - так что мне было интересно, как другие люди подойдут к этому?

Мартин.

Пс. Я попробовал этот грязный хакер, и он действительно работает. Тем не менее, все еще интересно услышать мнения других.


person Martin Milan    schedule 17.05.2011    source источник


Ответы (2)


Переименуйте действия и используйте ActionNameAttribute

<HttpGet>
<ActionName("Index")>
Public Function IndexGet() as ActionResult
...
End Function

<HttpPost>
<ActionName("Index")>
Public Function IndexPost() as ActionResult
...
End Function

Но я не знаю, что будет делать ваш метод POST, потому что он не получает никаких данных. Действия POST обычно требуют обработки некоторых данных поста, поэтому, вероятно, также потребуются некоторые параметры. Когда вы добавляете их, ваши два метода могут иметь одно и то же имя, поскольку их сигнатуры будут различаться (один будет без параметров, а другой с ними).

person Robert Koritnik    schedule 17.05.2011
comment
Я согласен, обычно у вас будет Index() в качестве метода GET и Index(posted params) в качестве метода POST. - person JK.; 17.05.2011

Просто короткое примечание, чтобы выделить фактический подход, который я принял в конце - хотя ответ Роберта выше также вполне верен ...

В итоге я использовал атрибут «.httpMethodConstraint» в аргументе ограничения функции MapRoute, а затем предоставил отдельные маршруты для различных типов задействованных методов.

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

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

Приветствую за помощь ...

person Martin Milan    schedule 20.05.2011