Как создать простой метод действия ASP.NET MVC, который принимает данные HTTP-POST?

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

это мой маршрут, который я хотел бы иметь:

HTTP.POST
/review/create

и это метод действия, который я хотел бы...

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult Create(int userId,
                         int addressId,
                         byte baseScore,
                         byte reviewType,
                         string subject,
                         string description)
{ ... }

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

вот мой global.asax....

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // Api - Search methods.
    routes.MapRoute(
        "Search Methods",
        "{controller}/{action}"
    );

На самом деле, метод действия никогда не вызывается, потому что, кажется, он его не находит:(

Но, если создать и действовать без каких-либо из этих аргументов, то он находит это?????????

Как бы вы написали маршрут и метод действия, чтобы принять некоторые требования и некоторые необязательные аргументы для маршрута / просмотра / создания?

4 ответа

Решение

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

public ActionResult Create(int foo, int bar, byte blah, string name, int? xxx) {
    // code here
}

Затем ModelBinder гарантирует, что foo,bar и blah установлены. Имя и ххх могут быть нулевыми. Я не могу проверить это в данный момент, но я думаю, что возвращаемый тип действия должен быть ActionResult,

Если вы создаете POST-форму, просто убедитесь, что элементы вашей формы (текстовые поля, флажки, текстовые области и т. Д.) Имеют идентификаторы, соответствующие параметрам в вашем методе. В качестве альтернативы вы можете передать FormCollection к методу, и сделать myFormCollection["foo"] чтобы получить строковое представление значения (которое затем может быть проанализировано в int).

Исходя из моего опыта, вы упускаете ряд ключевых элементов и концепций в этом вопросе.

Прежде всего, я не верю, что вы можете выполнить POST без формы. Форма должна содержать элементы управления, из которых вы извлекаете значения, которые передаются в метод контроллера. Если цель состоит в том, чтобы просто выполнить модульное тестирование вашего метода контроллера POST, то просто вызовите метод непосредственно в своем тесте, который, как вам кажется, вы делаете, основываясь на одном из ваших комментариев. Если вы используете представление, то вы проводите интеграционное тестирование, а не юнит-тестирование. Независимо от типа теста, тест всегда будет неудачным, потому что вы решили не создавать форму. Даже если вам удастся форсировать POST с помощью Fiddler, Firebug или любого другого механизма, вы все равно не тестируете представление, вы тестируете протокол HTTP.

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

В вашем почтовом запросе задайте content-type="application/json; charset=UTF-8" и передайте значения параметра метода в формате JSON. Это должно заставить Asp.MVC не искать в FormCollection эти значения.

Другие вопросы по тегам