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ć?

questionAnswers(2)

yourAnswerToTheQuestion