Как создать простой метод действия 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 эти значения.