электронная почта даже не очень хороший метод проверки пользователя. Его простые в использовании одноразовые почтовые службы , а также легко автоматизировать щелчок по ссылкам активации.
Есть ли способ обработать данные формы post в контроллере Web Api?
Обычный подход в ASP.NET Web API должен представлять форму как модель, поэтому форматер форматов мультимедиа десериализует его. Альтернативой является определение параметра действия как NameValueCollection:
public void Post(NameValueCollection formData)
{
var value = formData["key"];
}
У меня возникла проблема с отправкой запроса с несколькими параметрами.
Я решил его, отправив класс со старыми параметрами в качестве свойств.
<form action="http://localhost:12345/api/controller/method" method="post">
<input type="hidden" name="name1" value="value1" />
<input type="hidden" name="name2" value="value2" />
<input type="submit" name="submit" value="Submit" />
</form>
Модель класс:
public class Model {
public string Name1 { get; set; }
public string Name2 { get; set; }
}
Контроллер:
public void method(Model m) {
string name = m.Name1;
}
Трудно обрабатывать сразу несколько параметров. Лучший способ сделать это - создать класс модели представления. Затем у вас есть один параметр, но параметр содержит несколько свойств данных.
public class MyParameters
{
public string a { get; set; }
public string b { get; set; }
}
public MyController : ApiController
{
public HttpResponseMessage Get([FromUri] MyParameters parameters) { ... }
}
Затем вы переходите к:
http://localhost:12345/api/MyController?a=par1&b=par2
Ссылка: http: // www. asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Если вы хотите использовать «/ par1 / par2 ", вы можете зарегистрировать правило маршрутизации asp. например routeTemplate: «API / {controller} / {action} / {a} / {b}".
Я нашел для моего использования случай, это было намного более полезно, надеюсь, это помогает кому-то еще, потратившемуся на этот ответ, применяя его
public IDictionary<string, object> GetBodyPropsList()
{
var contentType = Request.Content.Headers.ContentType.MediaType;
var requestParams = Request.Content.ReadAsStringAsync().Result;
if (contentType == "application/json")
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<IDictionary<string, object>>(requestParams);
}
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
Сегодня, проведя довольно много времени, пытаясь обернуть мой мозг вокруг (значительного, но мощного) смещения парадигмы между старыми способами обработки данных веб-формы и тем, как это делается с помощью WebAPI, я думал, что добавлю свои 2 цента к этому обсуждению.
То, что я хотел сделать (что довольно часто используется для обработки веб-форм POST), заключается в том, чтобы иметь возможность захватывать любые значения форм, которые я хочу, в любом порядке. Скажите, что вы можете сделать, если у вас есть данные в файле System.Collections.Specialized.NameValueCollection
. Но получается, что в WebAPI данные из POST возвращаются к вам в качестве потока. Таким образом, вы не можете напрямую это сделать.
Но есть классный маленький класс с именем FormDataCollection
(в System.Net.Http.Formatting), и то, что он позволит вам сделать, - это перебирать вашу коллекцию один раз .
Итак, я написал простой метод утилиты, который будет запускаться через FormDataCollection
один раз и вставьте все значения в NameValueCollection
. Как только это будет сделано, вы можете перескакивать по всем данным в ваше сердце.
Итак, в моем производном классе ApiController у меня есть метод post, подобный этому:
public void Post(FormDataCollection formData)
{
NameValueCollection valueMap = WebAPIUtils.Convert(formData);
... my code that uses the data in the NameValueCollection
}
Метод преобразования в моем статическом классе WebAPIUtils выглядит следующим образом:
/// <summary>
/// Copy the values contained in the given FormDataCollection into
/// a NameValueCollection instance.
/// </summary>
/// <param name="formDataCollection">The FormDataCollection instance. (required, but can be empty)</param>
/// <returns>The NameValueCollection. Never returned null, but may be empty.</returns>
public static NameValueCollection Convert(FormDataCollection formDataCollection)
{
Validate.IsNotNull("formDataCollection", formDataCollection);
IEnumerator<KeyValuePair<string, string>> pairs = formDataCollection.GetEnumerator();
NameValueCollection collection = new NameValueCollection();
while (pairs.MoveNext())
{
KeyValuePair<string, string> pair = pairs.Current;
collection.Add(pair.Key, pair.Value);
}
return collection;
}
Надеюсь, что это поможет!
public void Post(Dictionary<string,string> formData)
, который также работает
– testpattern
24 May 2016 в 13:43
FormDataCollection
для моего WebHook для работы с другим поставщиком.
– MikeTeeVee
2 April 2017 в 14:44
FormDataCollection
похоже для Web Api, поскольку FormCollection
для контроллеров mvc! Это сработало для меня!
– petrosmm
11 July 2018 в 14:13
Попробуйте это.
public string Post(FormDataCollection form) {
string par1 = form.Get("par1");
// ...
}
Он работает для меня с помощью web api 2