2016-01-06 3 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; } 
} 

Так что я могу использовать Employee в качестве параметра действия, и это 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() (как оно может быть).

Два варианта:

-написать свою собственную модель связующего

или 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); 
    } 
} 
+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, вам это не нужно.

Смежные вопросы