2017-02-20 2 views
0

Из этой статьи here, что я хочу сделать, это получить пары значений ключа, отправленные формой aspnet/html, а затем поместить их в dto, которые затем я смогу использовать в другом месте в моем заявление. Я вижу, что внутри петли foreachЦенности от asp net form to Dto

public async Task<HttpResponseMessage> PostFormData() 
{ 
if (!Request.Content.IsMimeMultipartContent()) 
{ 
    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
} 

string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
var provider = new MultipartFormDataStreamProvider(root); 

try 
{ 
    await Request.Content.ReadAsMultipartAsync(provider); 

    // Show all the key-value pairs. 
    foreach (var key in provider.FormData.AllKeys) 
    { 
     foreach (var val in provider.FormData.GetValues(key)) 
     { 
      Trace.WriteLine(string.Format("{0}: {1}", key, val)); 
     } 
    } 

вы можете прочитать значения и отправить их на трасселин. Оттуда, как вы собираетесь превратить их в дто?

, чтобы перейти к примеру в ссылке. я хочу получить

public class trip{ 
    public string triptype {get; set;} 
    public string airports{get; set;} 
    DateTime? dates {get; set;} 

} 
+1

создать объект «путешествие» и заполнить свойства? Как и любой другой объект? – ADyson

+0

ОК, как именно? Это то, к чему я пытаюсь добраться. –

+1

'var tr = new trip();' Тогда в цикле 'tr.triptype = val;' или что-то еще. При необходимости отрегулируйте в зависимости от текущего ключа. Возможно, ключи соответствуют именам свойств класса Trip? Постскриптум Вы на самом деле пытаетесь загрузить файл или что-нибудь в этом? Потому что, если нет, вы можете просто использовать функциональные возможности привязки модели веб-API для непосредственной сопоставления загруженных данных в DTO, сделав параметр DTO параметром метода PostFormData. – ADyson

ответ

1

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

public async Task<HttpResponseMessage> PostFormData(Trip tr) 
{ 
    //do whatever you want here, you've already got a Trip object fully-formed (assuming the data is valid - the first thing you do you should be to check that): 
    if (!ModelState.IsValid) { 
    //return an error to the client 
    return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState); 
    } 

    //otherwise, carry on and do whatever processing you need 
    ///... 

    //last thing to do, return a response, something like: 
    return Request.CreateResponse(HttpStatusCode.OK, "Your request has been processed"); 
} 

Для этой работы, единственным требованием является то, что имена свойств «Trip» объекта совпадают представляется от вашей формы. Судя по именам свойств вы приводимые в ответе, вы просто нужно очень немного изменить свой объект поездки:

public class Trip { 
    public string trip { get; set; } 
    public string options { get; set; } 
    public string seat { get; set; } 
} 

Если вы не хотите, чтобы сделать это, то делать противоположный: модифицировать «имя» атрибутов HTML-формы, из которой вы отправляете, чтобы они соответствовали именам свойств объекта «Поезд».

И все - не нужно вручную заполнять свойства объекта из данных формы.

+0

это делает вещи намного проще. Я работал в предположении, что, поскольку форма отправляет обратно значения Key + и не отправляет Json или не отправляет данные так, как Mvc-формы отправляют данные сейчас, что это не сработает. Спасибо –

+1

нет. web api может принимать сериализованные данные формы, или JSON, или даже XML, я думаю. Не забывайте, что вы можете делать действия, которые принимают запрос GET - тогда данные не могут быть JSON. Вы просто задаете тип содержимого при выполнении запроса (для ajax или системных запросов). Для отправки HTML-формы он автоматически устанавливается браузером). В любом случае, если ответ помог вам, пожалуйста, подумайте о повышении/маркировке в качестве принятого ответа - спасибо :-) – ADyson

+0

Я попытался использовать его таким образом и получил «No MediaTypeFormatter доступен для чтения объекта типа« Поездка »из контента с типом мультимедиа ' многочастному/форм-данных «. и он не попал бы в контроллер. Если я изменю контроллер из PostFile (Trip tr), он попадет в контроллер, но я вернусь к квадрату. –

0

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

 var tr = new Trip 
       { 
        Triptype = provider.FormData.GetValues("trip").FirstOrDefault(), 
        Options = provider.FormData.GetValues("options").FirstOrDefault(), 
        Seat = provider.FormData.GetValues("seat").FirstOrDefault(), 
      };