无法将对象列表从视图发布到控制器

时间:2019-07-25 18:56:47

标签: c# asp.net-mvc asp.net-core razor

在将自定义对象列表传递到我的控制器时出现问题

这是模型

public class UploadDocumentViewModel
{
    public string EncryptedApplicationId { get; set; }
    public List<DocumentViewModel> Documents { get; private set; }

    public UploadDocumentViewModel()
    {
        Documents = new List<DocumentViewModel>();
    }

}

public class DocumentViewModel
{
    public IFormFile DocumentFile { get; set; }
    public string DocumentDescription { get; set; }
}

和表格

<form asp-action="UploadDocuments" enctype="multipart/form-data">
    <input asp-for="EncryptedApplicationId" type="hidden" />
    <div class="form-group mt-20">
    @for (int i = 0; i < Model.Documents.Count; i++)
    {
        <div class="form-group mt-20">
            <input asp-for="Documents[i]" type="hidden" />
            <label asp-for="Documents[i].DocumentDescription" />
            <input asp-for="Documents[i].DocumentFile" />
        </div>
    }
    </div>
    <div class="form-group mt-20">
        <a asp-action="Exit" asp-route-applicationId="@Model.EncryptedApplicationId" class="btn btn-info btn-primary btn-rounded text-left" style="position:relative;left:-1em;">Exit</a>
        <button type="submit" class="btn btn-info btn-success btn-rounded text-right" style="position:relative;right:-8em;">Continue  <i class="ti ti-angle-double-right" style="font-weight:bold;top:1px;right:-5px;position: relative;"></i></button>
    </div>
</form>

但是在我的Post方法中,我的model.Documents始终为空。不知道我在做什么错。

[HttpPost]
    public async Task<IActionResult> UploadDocuments(UploadDocumentViewModel model)

2 个答案:

答案 0 :(得分:0)

尝试删除asp-for属性并使用有效的name属性。您无需提供单词Model即可提供模型。

@for (int i = 0; i < Model.Documents.Count; i++)
{
    <div class="form-group mt-20">
        @* if you want to send the data in the DocumentFile property, just send it as a hidden *@
        @Html.HiddenFor(model => model.Documents[i].DocumentFile)       

        <label for="@Html.NameFor(model => model.Documents[i].DocumentFile)">@Html.DisplayFor(model => Documents[i].DocumentDescription)</label>

        @Html.EditorFor(model => model.Documents[i].DocumentFile)
    </div>
}

答案 1 :(得分:0)

结果证明,这要求我在视图模型上通过DocumentDescription尝试过的其他构造函数,但是在没有描述传递给控制器​​时,绑定总是失败。

<form asp-action="UploadDocuments" enctype="multipart/form-data">
    <input asp-for="EncryptedApplicationId" type="hidden" />
    @for (int i = 0; i < Model.Documents.Count; i++)
    {
        <div class="form-group mt-20">
            <input asp-for="Documents[i].DocumentDescription" type="hidden" />
            <label class="control-label">@Model.Documents[i].DocumentDescription</label>
            <input class="form-control" asp-for="Documents[i].DocumentFile" />
        </div>
    }
    <div class="form-group mt-20">
        <a asp-action="Exit" asp-route-applicationId="@Model.EncryptedApplicationId" class="btn btn-info btn-primary btn-rounded text-left" style="position:relative;left:-1em;">Exit</a>
        <button type="submit" class="btn btn-info btn-success btn-rounded text-right" style="position:relative;right:-8em;">Continue  <i class="ti ti-angle-double-right" style="font-weight:bold;top:1px;right:-5px;position: relative;"></i></button>
    </div>
</form>