Web-API-Modellbindung mit mehrteiligen Formeldaten

Ist es ein Weg, um in der Lage sein, um das Modell binden (oder was auch immer) zu geben, der das Modell aus einer multipart-form-data request in ASP.NET MVC-Web-API?

Sehe ich verschiedene blog-Beiträge, aber entweder die Dinge haben sich geändert zwischen der post und dem tatsächlichen release oder Sie nicht zeigen-Modell verbindlich arbeiten.

Dies ist ein veralteter post: Senden von HTML-Formular-Daten

und daher wird dies: Asynchrone Datei-Upload verwenden ASP.NET Web-API

Ich fand diesen code (und ein bisschen modifiziert) irgendwo liest die Werte manuell ein:

Modell:

public class TestModel
{
    [Required]
    public byte[] Stream { get; set; }

    [Required]
    public string MimeType { get; set; }
}

Controller:

    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);
}

Dieser code ist im Grunde zerbrechlich, un-wartbar und weitere, nicht durchsetzen, das Modell, die verbindlich oder Daten Anmerkung Einschränkungen.

Gibt es einen besseren Weg, dies zu tun?

Update: ich habe gesehen, dass dieses post und das macht mich denken - muss ich haben, schreiben Sie eine neue Formatierer für jedes einzelne Modell, die ich unterstützen möchte?

InformationsquelleAutor der Frage Mrchief | 2012-09-26

Schreibe einen Kommentar