我使用户能够在“添加/编辑产品”模式下为零售产品添加图像。
public class ProductModalViewModel
{
public ProductModalViewModel()
{
Product = new ProductDTO();
Images = new List<ProductImageViewModel>();
}
public ProductDTO Product { get; set; }
public List<ProductImageViewModel> Images { get; set; }
}
每个产品图片都包含在自己的ViewModel中,如下所示:
public class ProductImageViewModel
{
public ProductImageViewModel()
{
ProductImage = new ProductImageDTO();
}
public ProductImageDTO ProductImage { get; set; }
[DataType(DataType.Upload)]
public IFormFile ImageFile { get; set; }
}
提交表单以保存产品(以及所有添加的图像)后,我的请求被挂起并在Chrome开发工具中显示“待处理”。我的控制器操作从未达到。
仅当我在项目中包含ProductImage Fields / ViewModel / Logic时,才会发生这种情况。在将该功能添加到模式之前不会发生这种情况,并且如果我删除所有ProductImage Fields / ViewModel / Logic然后再次提交,效果很好。
将我的IFormFile包含在嵌套的ViewModel中是否存在固有的错误?或者这可能是别的东西。我其余的相关代码如下。
[HttpPost]
public IActionResult SaveProduct([FromForm]ProductModalViewModel model)
{
//save code
}
<form id="formSaveProduct" onsubmit="SaveProduct(event)" enctype="multipart/form-data">
//Other product fields removed for brevity
<div class="row">
<div class="col-md-12">
<ul class="list-group" id="image-list-group">
@for (int i = 0; i < Model.Images.Count(); i++)
{
<partial name="_ImageListItem" for="Images[i]" />
}
</ul>
</div>
</div>
</form>
<li class="list-group-item my-1">
<input type="hidden" asp-for="ProductImage.Id" class="image-id" />
<input type="hidden" asp-for="ProductImage.ProductId" class="image-productid" />
<div class="row">
<div class="col-3">
<input type="text" readonly asp-for="ProductImage.Order" class="image-order" />
</div>
<div class="col-6">
<img src="..\@Model.ProductImage.Path" class="image-display" />
</div>
</div>
</li>
function SaveProduct(e) {
e.preventDefault(); // prevent standard form submission
$.ajax({
url: "@Url.Action("SaveProduct", "ProductManagement", new { Area = "Admin" })",
method: "post",
data: new FormData($('#formSaveProduct')[0]),
contentType: false,
processData: false,
cache: false,
success: function (result) {
//removed for brevity
}
});
}
答案 0 :(得分:1)
首先,您不需要这个
[DataType(DataType.Upload)]
public IFormFile ImageFile { get; set; }
因此您可以将代码更改为
public IFormFile ImageFile { get; set; }
在脚本中,您应该添加contentType
function SaveProduct(e) {
e.preventDefault(); // prevent standard form submission
$.ajax({
url: "@Url.Action("SaveProduct", "ProductManagement", new { Area = "Admin" })",
method: "post",
data: new FormData($('#formSaveProduct')[0]),
contentType: false,
processData: false,
cache: false,
contentType: "multipart/form-data", //here
success: function (result) {
if (result.success) {
$("#exampleModal").modal('toggle');
location.reload();
}
else {
$(".modal-body").html(result);
}
}
});
}
答案 1 :(得分:0)
以下帖子中的概念性问题很好地回答了这个问题: