直接从ViewModel将另一个类(文件)值从视图传递到控制器

时间:2019-02-13 13:56:07

标签: c# asp.net

FunwarsVM.cs

public class FunwarsVM : IFunwars
{
    public int Id { get; set; }
    public string Date { get; set; }
    public string OurTeam { get; set; }
    public string Status { get; set; }
    public string Opponent { get; set; }
    public string Score { get; set; }
    public int FileID { get; set; }

    public List<Funwars> Funwars { get; set; }

    [NotMapped]
    public  ImageUpload Files { get; set; }

    public FunwarsVM()  
    {
        this.Funwars = new List<Funwars>();
        this.Files = new ImageUpload();
    }
}

ImageUpload.cs

public class ImageUpload
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string MimeType { get; set; }
    public string FilePath { get; set; }


    [NotMapped]
    public List<IFormFile> Images { get; set; }
}

查看(仅图像上传部分)

<form id="holder" method="post" action="/Funwars/Add" enctype="multipart/form-data">

    <div class="form-group">

        <h3>Screenshots</h3>

        <input type="file" name="files.images" value="@Model.Files.Images" multiple />

    </div>       
    <input type="submit" name="submit" value="Submit" />
</form>

控制器

[HttpPost]
public async Task<IActionResult> Add(FunwarsVM model)
{

    model.Add();
    return RedirectToAction("Index",model);
}

所以,我想将图像文件从视图传递到控制器。当我在视图中传递@Model.Files.Images时,意味着我正在传递List<IFormFile>到我的模型,但它传递了null

但是当我添加

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

直接添加到我的FunwarsVM,然后将@Model.Images传递到我的视图,它返回我要添加的正确图片!

当我创建List<IFormFile>模型的实例后从视图中调用ImageUpload对象时,为什么它不起作用,但是当我直接调用它时,它起作用了吗??

2 个答案:

答案 0 :(得分:0)

由于控制器动作的参数中仅包含FunwarsVM模型,因此除非它是FunwarsVM对象的一部分,否则它将永远不会正确绑定,这就是为什么在使用模型时它可以工作的原因。

如果添加新参数List<IFormFile> images,则它应该可以正常工作。不要在定义参数的方式上引用我,但我认为它必须与name属性具有相同的名称才能自动绑定。

编辑

添加第二个参数,以便将其绑定到其他内容。

[HttpPost]
public async Task<IActionResult> Add(FunwarsVM model, List<IFormFile> images)
{
    model.Add();
    return RedirectToAction("Index",model);
}

答案 1 :(得分:0)

由于某些未知原因,如果仅传递一个属性(对于您的情况为Images),则ASP.NET Core不会将文件绑定到嵌套对象。所以解决方案是只添加该类的其他任何属性来查看

<input type="hidden" name="files.id" />
<input type="file" name="files.images" value="@Model.Files.Images" multiple />