Asp.Net 模型绑定到包装属性

Asp.Net model binding to wrapped properties

我正在使用 ASP.Net MVC 4,但我遇到了模型绑定方面的问题。

如果有两个class:

public class Employee {
    public string Name { get; set; }
    public List<JobSkill> JobSkills { get; set; }
}

public class JobSkill {
    public string Name { get; set; }
}

所以我可以使用 Employee 作为操作的参数,如果它接收到嵌套的 JobSkills 数组的数据,它的 JobSkills 属性 就不会为空。

public ActionResult Create(Employee employee) {
    var jobSkillAmount = employee.JobSkills.Count();
    ....
}

我的问题是,如果我将 JobSkills 属性 包装到另一个 class,例如:

public class HasMany<T> {
    private List<T> Items { get; set; }

    public class HasMany() {
    }

    public class HasMany(List<T> items) {
        Items = items;
    }

    public void SetItems(List<T> items) {
        Items = items;
    }
}

public class Employee {
    public string Name { get; set; }
    public HasMany<JobSkill> JobSkills { get; set; }
}

public class JobSkill {
    public string Name { get; set; }
}

我找不到让操作像以前一样工作的方法。 有什么方法可以让模型绑定生效吗?

问题是因为默认模型绑定器知道如何绑定到 List<T> 但对 HasMany<T>.SetItems() 一无所知(怎么可能)。

两个选项:

1 编写自己的模型活页夹

或2继承自List<T>(未经测试,可能还是不行,但最快可以试试),即:

public class HasMany<T> : List<T> {
    public class HasMany() {
    }

    public class HasMany(List<T> items) {
        this.Clear();
        this.AddRange(items);
    }

    public void SetItems(List<T> items) {
        this.Clear();
        this.AddRange(items);
    }
}

像这样改变你的模型:

public class Employee {
public string Name { get; set; }
public virtual ICollection<JobSkill> JobSkills { get; set; }

}

public class JobSkill {
    public string Name { get; set; }
}

并提交 HasValue 代码,您不需要它。