Свойство IFormFile в .NET Core ViewModel, вызывающее остановленный AJAX-запрос - PullRequest
0 голосов
/ 28 мая 2019

Я даю пользователям возможность добавлять изображения для розничного продукта внутри модального окна Добавить / Редактировать продукт.

Модальная модель представления:

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

    public ProductDTO Product { get; set; }

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

Каждое изображение продукта содержится в егособственный ViewModel, как показано ниже:

Image ViewModel:

public class ProductImageViewModel
{
    public ProductImageViewModel()
    {
        ProductImage = new ProductImageDTO();
    }

    public ProductImageDTO ProductImage { get; set; }

    [DataType(DataType.Upload)]
    public IFormFile ImageFile { get; set; }
}

При отправке формы для сохранения продукта (и любых добавленных изображений) мой запрос зависает и отображает "в ожидании" в ChromeИнструменты разработки.Мое действие контроллера никогда не достигается.

Это происходит только тогда, когда я включаю поля ProductImage / ViewModel / Logic в свой проект.Этого не происходило до добавления этой функциональности в модальный режим, и она работает нормально, если я удаляю все поля ProductImage Fields / ViewModel / Logic, а затем снова отправляю.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 ]

1 голос
/ 28 мая 2019

Сначала вам это не нужно

[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);
            }
        }
    });
}
0 голосов
/ 29 мая 2019

На этот вопрос чудесным образом ответил мой концептуальный вопрос в следующем посте:

IFormFile как вложенное свойство ViewModel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...