【问题标题】:IFormFile as a Nested ViewModel PropertyIFormFile 作为嵌套的 ViewModel 属性
【发布时间】:2019-10-14 07:13:18
【问题描述】:

我正在尝试将 IFormFile 用作嵌套 ViewModel 中的属性。我在尝试将 ViewModel 绑定到运行时的控制器操作时遇到问题。 AJAX 请求停止并且永远不会到达操作。

这个概念性问题参考了我在IFormFile property in .NET Core ViewModel causing stalled AJAX Request 的具体问题

视图模型:

public class ProductViewModel
{
    public ProductDTO Product { get; set; }
    public List<ProductImageViewModel> Images { get; set; }
}

嵌套视图模型:

public class ProductImageViewModel
{
    public ProductImageDTO ProductImage { get; set; }
    public IFormFile ImageFile { get; set; }
}

行动:

[HttpPost]
public IActionResult SaveProduct([FromForm]ProductViewModel model)
{
    //save code
}

我想知道 IFormFile 属性是否需要是您绑定到控制器操作的 ViewModel 的直接属性

IFormFile Documentation 似乎没有回答我的问题。

【问题讨论】:

  • 您应该使用 multipart/form-data content-type 并传递表单名称为 Images[0].ImageFile, Images[1].ImageFile 的文件用于多文件上传

标签: c# asp.net-core .net-core


【解决方案1】:

AJAX 请求停止并且永远不会到达操作。

这是一个已知问题,已在 v3.0.0-preview 中修复,不会合并到 2.2.x 分支中。请参阅#4802

当使用IList&lt;Something&gt; Something 发布表单时,其中Something 直接具有IFormFile 的属性,它将导致无限循环。因为模型绑定发生在调用action方法之前,你会发现它从来没有进入action方法。此外,如果您检查任务管理器,您会发现内存使用情况非常疯狂。

按照@WahidBitar 的建议,要绕过它,只需在IFormFile 上创建一个包装器,这样Something 就没有IFormFile 直接。

至于你的问题本身,改变你的代码如下:

公共类 ProductViewModel { 公共 ProductDTO 产品 { 获取;放; } 公共列表 图片 { 获取;放; } } 公共类 ProductImageViewModel { 公共 ProductImageDTO ProductImage { 获取;放; } // 因为这个 ProductImageViewModel 将被嵌入为 List // 确保它没有直接的 IFormFile 属性 public IFormFile ImageFile { get;放; } 公共 IFormFileWrapper Image{ 获取;放; } // 一个虚拟包装器 公共类 IFormFileWrapper { 公共 IFormFile 文件 { 获取;设置;} } }

现在您的客户端应该将字段名称重命名如下:

Images[0].ProductImage.Prop1     # Your DTO prop's
Images[0].Image.File             # instead of Images[0].ImageFile
Images[0].ProductImage.Prop2     # Your DTO prop's
Images[1].Image.File             # instead of Images[1].ImageFile
...                              # other images
Product.Prop1
Product.Prop2
...                              # other props of Product

工作演示:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多