IFormFile как вложенное свойство ViewModel - PullRequest
2 голосов
/ 28 мая 2019

Я пытаюсь использовать IFormFile как свойство во вложенной ViewModel.Я сталкиваюсь с проблемами, пытающимися связать ViewModel с действием контроллера во время выполнения.Запрос AJAX останавливается и никогда не достигает действия.

Этот концептуальный вопрос относится к моей конкретной проблеме в Свойство IFormFile в .NET Core ViewModel, вызывающее остановку запроса AJAX

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 не отвечает на мой вопрос.

1 Ответ

2 голосов
/ 29 мая 2019

Запрос AJAX останавливается и никогда не достигает действия.

Это известная проблема, которая была исправлена ​​в v3.0.0-preview и не будет объединена с веткой 2.2.x.См. # 4802 .

При публикации формы с IList<Something> Something, где Something имеет свойство IFormFile напрямую , это приведет к бесконечному циклу .Поскольку привязка модели происходит до вызова метода действия, вы обнаружите, что она никогда не входит в метод действия.Кроме того, если вы осмотрите диспетчер задач, вы обнаружите, что использование памяти сумасшедшим.

Чтобы обойти это, как предлагает @ 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 <b>embedded as List<ProductImageViewModel></b>
        //     make sure it <b>has no IFormFile property directly</b>
        <strike>public IFormFile ImageFile { get; set; }</strike>
        <b>public IFormFileWrapper Image{ get; set; }</b>  

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

Теперь ваша сторона клиента должна переименовать имя поля, как показано ниже:

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

A РабочийДемо:

enter image description here

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