【发布时间】:2022-01-15 06:16:04
【问题描述】:
假设我有一个这样的 ViewModel,来自 ASP.NET MVC 中的表单提交:
public class EditProfileViewModel
{
public string DisplayName { get; set; }
public IFormFile Photo { get; set; }
}
我可以在控制器中轻松接收这个:
public async Task<IActionResult> OnPost([FromForm] EditProfileViewModel edits)
{
// edits contains form data, great
}
但现在我想将此转发到后端 API,也使用 ASP.NET。包括文件上传。最简单的方法似乎是使用 MultipartFormDataContent 创建一个带有 HttpClient 的新表单 POST。但据我所知,虽然在接收请求时从表单内容到模型类的转换是透明的,但创建 MultipartFormDataContent 需要对键值对进行硬编码。
我知道可以这样做:
var form = new MultipartFormDataContent()
form.Add(new StringContent(edits.DisplayName), "displayName")
var content = new StreamContent(edits.Photo.OpenReadStream());
content.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType)
form.Add(content, "photo") // Is this the right capitalization ?? See how error prone this is?
var result = await client.PostAsync("some-api", form);
但这很冗长且容易出错,并且有重复的声明。此外,要在接收端使用相同的模型类进行反序列化,需要了解转换魔法。
有没有更好的方法将模型类转换回 MultipartFormDataContent?或者,如果这是一个 XY 问题,是否有更好的方法将此表单模型完全转发到后端 ASP.NET API?
【问题讨论】:
标签: c# asp.net asp.net-mvc asp.net-web-api