IFormFile作为嵌套的ViewModel属性

时间:2019-05-28 17:49:09

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

我正在尝试将IFormFile用作嵌套ViewModel中的属性。我在尝试在运行时将ViewModel绑定到控制器操作时遇到问题。 AJAX请求停滞不前,无法执行操作。

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

ViewModel:

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

嵌套的ViewModel:

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似乎无法回答我的问题。

1 个答案:

答案 0 :(得分:2)

  

AJAX请求停顿,再也没有实现。

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

发布带有IList<Something> Something的表单时,其中Something 直接具有IFormFile的属性,它将无限循环 >。因为模型绑定发生在调用action方法之前,所以您会发现它永远不会进入action方法。另外,如果检查任务管理器,您会发现疯狂的内存使用情况。

要绕过它,如@WahidBitar所建议,只需在IFormFile上创建一个包装器,以使Something不直接具有IFormFile

对于您自己的问题,请如下更改代码:

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


    public class ProductImageViewModel
    {
        public ProductImageDTO ProductImage { get; set; }
        // since this ProductImageViewModel will be embedded as List<ProductImageViewModel>
        //     make sure it has no IFormFile property directly
        public IFormFile ImageFile { get; set; }
        public IFormFileWrapper Image{ get; set; }  

        // a dummy wrapper
        public class IFormFileWrapper
        {
            public IFormFile File { get; set;}
        }
    }

现在,您的客户端应按以下方式重命名字段名称:

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

工作演示:

enter image description here