c# - MVC - 绑定(bind) ICollection 属性

标签 c# asp.net-mvc

我首先使用 MVC 和 EF DB。我的模型是由 EF 创建的。在我的模型中,我有两个 ICollection 类型属性。

我的问题是当我发布表单时,这些属性是空的(我不会发送它们来查看空值)

我的模型:

    public partial class Account
    {
        public Account()
        {
            this.Account_Level = new HashSet<Account_Level>();
            this.Account_Team = new HashSet<Account_Team>();
        }

        public long Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public bool IsAdmin { get; set; }

        public virtual ICollection<Account_Level> Account_Level { get; set; }
        public virtual ICollection<Account_Team> Account_Team { get; set; }
    }

注意:我的 ICollection 属性不存在于我的 View 中,但我需要它们返回到我的 Controller 中。

编辑:

我已将以下代码添加到我的 View 中。在我的 html 中,我可以看到我的 Icollection 值被添加为隐藏,但当我发布帖子时,ICollection 属性仍然为空。所以我仍然没有恢复这些值。

for (int i = 0; i < Model.Account_Level.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).AccountId)
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).Id)
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).LevelId)
}

for (int i = 0; i < Model.Account_Team.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).AccountId)
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).Id)
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).TeamId)
}

最佳答案

您的代码存在的问题是 DefaultModelBinder 无法将您的隐藏字段绑定(bind)到您的模型,因为您的隐藏字段未遵循正确的命名约定

Razor View 中的 HiddenFor 方法会生成类似以下内容的内容:

<input id="AccountId" type="hidden" value="1" name="AccountId" data-val-required="The AccountId field is required." data-val-number="The field AccountId must be a number." data-val="true">

如您所见,生成的名称是 AccountId 如果您想使其可绑定(bind),则这是不正确的。

正确的名称必须类似于 Account_Level[0].AccountId

以下是隐藏字段正确命名的完整示例:

for (int i = 0; i < Model.Account_Level.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).AccountId, new { @Name = string.Format("Account_Level[{0}].AccountId", i) })
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).Id, new { @Name = string.Format("Account_Level[{0}].Id", i) })
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).LevelId, new { @Name = string.Format("Account_Level[{0}].LevelId", i) })
}

这将确保默认模型绑定(bind)器能够识别您的隐藏字段名称。

在这里您可以找到有关 ASP.NET MVC 命名约定的更多信息:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

关于c# - MVC - 绑定(bind) ICollection 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26752793/

相关文章:

c# - Ninject NamedScope 条件绑定(bind)

c# - 如何管理 ThreadPool 中的项目?

c# - 将 .NET 库移植到 PCL 时如何解决缺少 ICloneable 接口(interface)的问题?

对话框错误中的 JQuery 自动完成

asp.net-mvc - 将下拉列表中的 SelectedItem 绑定(bind)到 MVC 4 中的模型对象

javascript - 带有 Ajax 调用的 Bootstrap Popover 不显示数据

c# - 有没有办法在 C# 中的 2 个 IEnumerable 中对每个元素对执行 foreach?

javascript - 如何禁用所有浏览器的 razor 组件中使用的 `<InputText type="password">` 字段中显示的建议密码列表

c# - 任务异步 Controller 方法未命中

asp.net-mvc - MvcIntegrationTestFramework 或针对 ASP.NET MVC 3 更新的替代方案