如何发布包含Iformfile的视图模型数组的表单?

时间:2019-05-09 18:45:05

标签: c# asp.net-core model-binding

我正在尝试发布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>

但是,如果我向ViewModel添加一个IFormFile并再次发布该表单,则该表单将无法到达post action方法。

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页面

我做错了什么吗?还是与asp.net核心有关?

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法,即将文件绑定到List<IFormFile>,并在foreach循环中将值分配给Photo的{​​{1}}。

我还发现,仅当模型绑定使用People属性忽略Photo属性时,它才起作用。

请参阅下面的演示

ViewModel:

[BindNever]

PageModel:

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

查看:

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