2016-01-06 40 views
0

我正在使用ASP.Net MVC 4,我有關於模型綁定的問題。Asp.Net模型綁定到包裝的屬性

如果有兩大類:

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

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

所以我可以用員工作爲行動的參數,它是如果它收到了嵌套JobSkills陣列數據JobSkills屬性將不能爲空。

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

我的問題是,如果我換行JobSkills財產到另一個類,例如什麼:如前

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; } 
} 

我不能找到一種方法,讓行動工作。 是否有任何方法讓模型綁定使它工作?

+0

你爲什麼要包裝它? –

+0

我想將一些邏輯移到HasMany中,所以我可以這樣做:employee.JobSkills.Save()或employee.JobSkills.Destroy() – Ray

回答

2

問題是因爲默認的模型綁定器知道如何綁定到List<T>,但對HasMany<T>.SetItems()一無所知(它怎麼可能)。

兩個選項:

1編寫自己的模型綁定

List<T> 2繼承(未經測試,也許它仍然不會工作,但最快的嘗試),即:

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); 
    } 
} 
+0

謝謝,它適用於我! – Ray

0

改變你的模型是這樣的:

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

}

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

並提交HasValue代碼,你不需要它。