Как опубликовать форму с массивом моделей представлений, которые включают Iformfile? - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь опубликовать список PersonViewModel, он работает нормально, пока PersonViewModel не имеет никакого свойства IFormFile.

Модель страницы бритвы:

public class TestModel : PageModel
{
    [BindProperty]
    public PersonViewModel[] People { get; set; }

    public void OnGet()
    {

    }

    public void OnPost()
    {
        // Do something with People property
    }
}

ViewModel:

public class PersonViewModel
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

Форма HTML:

<form method="post" enctype="multipart/form-data">

    <input type="text" name="People[0].Name" class="form-control" />
    <input type="text" name="People[0].LastName" class="form-control" />

    <input type="text" name="People[1].Name" class="form-control" />
    <input type="text" name="People[1].LastName" class="form-control" />

    <button type="submit" class="btn btn-success">Submit</button>
</form>

Однако, если я добавлю IFormFile в ViewModel и снова отправлю форму, форма не достигнет метода отправки действия.

ViewModel:

public class PersonViewModel
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public IFormFile Photo { get; set; } = null;
}

Форма HTML:

<form method="post" enctype="multipart/form-data">
    <input type="text" name="People[0].Name" class="form-control" />
    <input type="text" name="People[0].LastName" class="form-control" />
    <input type="file" name="People[0].Photo" class="form-control" />

    <input type="text" name="People[1].Name" class="form-control" />
    <input type="text" name="People[1].LastName" class="form-control" />
    <input type="file" name="People[1].Photo" class="form-control" />

    <button type="submit" class="btn btn-success">Submit</button>
</form>

Версия проекта: ASP.NET Core 2.2

Шаблон проекта: ASP.NET Razor Pages

Есть ли что-то, что я делаю неправильно или это связано с ядром asp.net?

1 Ответ

0 голосов
/ 10 мая 2019

Я нахожу обходной путь, привязывая файлы к List<IFormFile> и присваивая значение Photo из People в цикле foreach.

Я также считаю, что это работает только тогда, когда привязка модели игнорируетPhoto свойство с использованием атрибута [BindNever].

См. Демонстрационный пример ниже:

ViewModel:

public class PersonViewModel
{
    public string Name { get; set; }
    public string LastName { get; set; }
    [BindNever]
    public IFormFile Photo { get; set; }
}

PageModel:

public class TestModel : PageModel
{

    [BindProperty]
    public List<PersonViewModel> People { get; set; }

    [BindProperty]
    public List<IFormFile> FileLists { get; set; }

    public void OnGet()
    {

    }

    public void OnPost()
    {
        for (int i = 0; i < People.Count; i++)
        {
            People[i].Photo = FileLists[i];
        }
        //var formFile = HttpContext.Request.Form.Files;
        // Do something with People property
    }
}

Вид:

<form method="post" id="typea" enctype="multipart/form-data">
    <input type="text" name="People[0].Name" class="form-control" />
    <input type="text" name="People[0].LastName" class="form-control" />
    <input type="file" asp-for="FileLists" class="form-control" />


    <input type="text" name="People[1].Name" class="form-control" />
    <input type="text" name="People[1].LastName" class="form-control" />
    <input type="file" asp-for="FileLists" class="form-control" />

    <button class="btn btn-success" type="submit">Submit</button>
</form>
...