ASP.Net MVC Маршрутизация с HTTP-глаголами действий - PullRequest
1 голос
/ 17 мая 2011

Я пишу реализующее веб-приложение 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..Необязательный.Имея это в качестве аргумента в процедуре post, это создаст новую сигнатуру метода, которая, как я ожидаю, будет в порядке.

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

Мартин.

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

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

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

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

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

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

1 голос
/ 20 мая 2011

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

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

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

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

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

...