ASP.NET MVC Web APIのマルチパート フォーム データ要求からモデルを提供するモデル バインディング (または何でも) を取得できる方法はありますか?
さまざまなブログ投稿を目にしますが、投稿と実際のリリースの間で変更があったか、モデル バインディングが機能していません。
これは古い投稿です: HTML フォーム データの送信
これもそうです:ASP.NET Web APIを使用した非同期ファイルアップロード
値を手動で読み取るこのコードをどこかで見つけました(そして少し変更しました):
モデル:
public class TestModel
{
[Required]
public byte[] Stream { get; set; }
[Required]
public string MimeType { get; set; }
}
コントローラ:
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);
}
テスト:
[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);
}
このコードは基本的に壊れやすく、保守できず、さらにモデル バインディングやデータ注釈の制約を適用しません。
これを行うより良い方法はありますか?
更新:この投稿を見て考えさせられました。サポートしたいモデルごとに新しいフォーマッターを作成する必要があるのでしょうか?