我正在尝试将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似乎无法回答我的问题。
答案 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 directlypublic 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
工作演示: