对象的模型绑定集合是ASP.Net Core MVC中模型的一种属性

时间:2019-07-25 15:55:38

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

我有一个PostEditViewModel类

 public class PostCreateViewModel
{
    public int PostId { get; set; }
    public string Title { get; set; } 
    public string Body { get; set; } 

    public string Descrition { get; set; } 
    public string Category { get; set; }

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

和ImagePath类

public class ImagePath
{
    public int ID { get; set; }
    public string Path { get; set; }
}

在我的编辑视图中,我尝试将ExistingPhotoPaths属性隐藏为

<input hidden asp-for="PostId" />

    @foreach (var path in Model.ExistingPhotoPaths)
    {
        i = i++;
        string x = val + i.ToString();
        <input type="hidden" name="ExistingPhotoPaths.Index" value="@x" />
        <input type="hidden" name="ExistingPhotoPaths[@x].Key" value="@path.ID" />
        <input type="hidden" name="ExistingPhotoPaths[@x].Value" value="@path.Path" />
    }

其中val是用于绑定在ASP.NET Core Model Bind Collection of Unknown Length这个问题中提到的非顺序索引的字符串。

但是我的ExistingPhotoPaths属性也使用此方法,返回null的集合。即假设在获取请求时ExistingPhotoPaths在发布请求时包含3个ImagePath对象,它返回3个空对象的数组,请参见下图,在发布请求时,请查看ExistingPhotoPaths包含什么。

enter image description here

我是使用正确的方法还是建议我做一个更好的方法以及我在哪里遇到了问题?

1 个答案:

答案 0 :(得分:0)

您需要这样做:

@for (var i = 0; i < Model.ExistingPhotoPaths.Count; i++)
{
    <input type="hidden" asp-for="ExistingPhotoPaths[i].ID" />
    <input type="hidden" asp-for="ExistingPhotoPahts[i].Path" />
}

您当前使用的语法用于绑定到字典,而不是对象列表,并且foreach在这里不起作用,因为Razor需要整个模型表达式路径来构建正确的输入名称。 / p>