.NET Core ViewModel中的IFormFile属性导致停滞的AJAX请求

时间:2019-05-28 01:39:20

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

我使用户能够在“添加/编辑产品”模式下为零售产品添加图像。

模态ViewModel:

public class ProductModalViewModel
{
    public ProductModalViewModel()
    {
        Product = new ProductDTO();
        Images = new List<ProductImageViewModel>();
    }

    public ProductDTO Product { get; set; }

    public List<ProductImageViewModel> Images { get; set; }
}

每个产品图片都包含在自己的ViewModel中,如下所示:

图像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>

PartialView(ProductImage):

<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
        }
    });
}

2 个答案:

答案 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)

以下帖子中的概念性问题很好地回答了这个问题:

IFormFile as a Nested ViewModel Property