Powiązanie modelu Web API z danymi wieloczęściowymi
Czy istnieje sposób, aby uzyskać powiązanie modelu (lub cokolwiek innego), aby dać model z wieloczęściowego żądania danych formularza wASP.NET MVC Web API?
Widzę różne posty na blogach, ale albo zmieniły się rzeczy między postem a rzeczywistym wydaniem, albo nie pokazują działania modelu.
To jest przestarzały post:Wysyłanie danych formularza HTML
i tak jest:Asynchroniczne przesyłanie plików za pomocą interfejsu API ASP.NET Web
Znalazłem ten kod (i zmodyfikowałem nieco) gdzieś, który odczytuje wartości ręcznie:
Model:
public class TestModel
{
[Required]
public byte[] Stream { get; set; }
[Required]
public string MimeType { get; set; }
}
Kontroler:
public HttpResponseMessage Post()
{
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
IEnumerable<HttpContent> parts = Request.Content.ReadAsMultipartAsync().Result.Contents;
string mimeType;
if (!parts.TryGetFormFieldValue("mimeType", out mimeType))
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
var media = parts.ToArray()[1].ReadAsByteArrayAsync().Result;
// create the model here
var model = new TestModel()
{
MimeType = mimeType,
Stream = media
};
// save the model or do something with it
// repository.Save(model)
return Request.CreateResponse(HttpStatusCode.OK);
}
Test:
[DeploymentItem("test_sound.aac")]
[TestMethod]
public void CanPostMultiPartData()
{
var content = new MultipartFormDataContent { { new StringContent("audio/aac"), "mimeType"}, new ByteArrayContent(File.ReadAllBytes("test_sound.aac")) };
this.controller.Request = new HttpRequestMessage {Content = content};
var response = this.controller.Post();
Assert.AreEqual(response.StatusCode, HttpStatusCode.OK);
}
Ten kod jest w zasadzie kruchy, nie do utrzymania i dalej, nie wymusza wiązania modelu lub ograniczeń adnotacji danych.
Czy jest lepszy sposób, aby to zrobić?
Aktualizacja: Widziałem tosłupek a to sprawia, że myślę - czy muszę napisać nowy formater dla każdego pojedynczego modelu, który chcę obsługiwać?