Как получить доступ к части данных в ng-файле-upload в asp.net webapi? [Дубликат]

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

40
задан Kara 26 February 2014 в 23:37
поделиться

7 ответов

Есть ли способ обработать данные формы post в контроллере Web Api?

Обычный подход в ASP.NET Web API должен представлять форму как модель, поэтому форматер форматов мультимедиа десериализует его. Альтернативой является определение параметра действия как NameValueCollection:

public void Post(NameValueCollection formData)
{
  var value = formData["key"];
}
58
ответ дан Community 15 August 2018 в 15:49
поделиться
  • 1
    в третьем примере вы также можете использовать return p.Result [key] .Value & lt; T & gt; (); – Manuel Koch 1 September 2017 в 09:17
  • 2
    @ManuelKoch Спасибо. Я хотел бы подумать, что они добавили это удобство в течение последних 4 лет;) – drzaus 6 September 2017 в 15:06
  • 3
    Это очень хорошо работает для быстрого тестирования, но поскольку мы используем строгий язык, модель класса должна быть создана как ответ by @ Corné Strijkert – Steve Parish 5 April 2018 в 14:12
58
ответ дан Community 5 September 2018 в 14:57
поделиться

У меня возникла проблема с отправкой запроса с несколькими параметрами.

Я решил его, отправив класс со старыми параметрами в качестве свойств.

<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;
}
9
ответ дан Corné Strijkert 15 August 2018 в 15:49
поделиться

Трудно обрабатывать сразу несколько параметров. Лучший способ сделать это - создать класс модели представления. Затем у вас есть один параметр, но параметр содержит несколько свойств данных.

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}".

См. http://www.asp.net/web-api/overview/ веб-API-маршрутизации-и-действия / маршрутизации-в-ASPnet-веб-API

9
ответ дан Curtis Yallop 15 August 2018 в 15:49
поделиться

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

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);
        }
3
ответ дан Maslow 15 August 2018 в 15:49
поделиться

Сегодня, проведя довольно много времени, пытаясь обернуть мой мозг вокруг (значительного, но мощного) смещения парадигмы между старыми способами обработки данных веб-формы и тем, как это делается с помощью 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;
     }

Надеюсь, что это поможет!

16
ответ дан Mattias Josefsson 15 August 2018 в 15:49
поделиться
  • 1
    Вы просто копируете другой ответ от другого пользователя: Brandon Bearden – Leandro Tupone 3 December 2014 в 16:44
  • 2
    Вариантом этого является public void Post(Dictionary<string,string> formData), который также работает – testpattern 24 May 2016 в 13:43
  • 3
    @LeandroTupone Это not копия ответа Brandon Bearden: stackoverflow.com/a/23943276/555798 Однако Брэд основывал свой ответ на Скотта Стоуна (без ссылки на его или ссылку на дублированный вопрос): stackoverflow.com/a/26393562/555798 Я счастлив за ответ, потому что именно здесь я нашел, что мне нужно использовать FormDataCollection для моего WebHook для работы с другим поставщиком. – MikeTeeVee 2 April 2017 в 14:44
  • 4
    Почему вы выполняете foreach вручную? – Matti Virkkunen 21 December 2017 в 13:06
  • 5
    FormDataCollection похоже для Web Api, поскольку FormCollection для контроллеров mvc! Это сработало для меня! – petrosmm 11 July 2018 в 14:13

Попробуйте это.

public string Post(FormDataCollection form) {
    string par1 = form.Get("par1");

    // ...
}

Он работает для меня с помощью web api 2

1
ответ дан RaphaMex 15 August 2018 в 15:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: