2010-08-13 2 views
2

Как мне получить свойства в моем BLL, переданном в ModeView. Например, у меня есть этот класс в отдельных библиотеках классов:MVC2 ViewModel Binding

[MetadataType(typeof(PersonMetaData))] 
public partial class Person 
{   
    [Bind(Include = "PersonId,DepartmentId,FirstName,LastName,Active,DateAdded,DateDeleted")] 
    public class PersonMetaData 
    {   
     public object PersonId { get; set; } 

     public object DepartmentId { get; set; } 

     public object FirstName { get; set; } 

     public object LastName { get; set; } 

     public Department PersonDepartment { get; set; } 

     public string FullName() 
     { 
      return string.Format("{0} {1}", FirstName, LastName); 
     } 
    } 
} 

Моего ViewModel выглядит следующим образом:

public class PersonViewModel 
{ 
    public int PersonId { get; set; } 
    public string FullName{ get; set; } 
    public string PersonDepartment { get; set; } 
} 

Когда я создать новый «вид» сильно типизированный к PersonViewModel и установить в качестве «Список» Просмотр содержимого .... страница сгенерирована, но FullName не проходит.

Я создал свойство PersonDepartment, потому что я хочу отобразить имя отдела, в котором находится человек. У меня есть класс отдела, настроенный аналогичным образом. Например, я хочу иметь возможность сделать что-то вроде «PersonDepartment.DepartmentName», которое отображает название отдела на странице.

Я использую DBML (Linq To SQL), поэтому частичные классы расширяются из автоматически сгенерированных классов.

Я не уверен, как получить заполненную недвижимость FullName и передать в ViewModel и получить свойства Департамента, связанные с передаваемой информацией Лица. Любая помощь будет принята с благодарностью.

+2

Я предполагаю, конечно, что вы заполняете модель представления, прежде чем передавать ее на представление, да? – joshlrogers

+0

Извините - да. ViewModel заполняется с использованием библиотеки AutoMapper. Картирование работает, потому что свойство PersonId фактически проходит. – obautista

ответ

1

Вы упомянули, что используете AutoMapper. В вашей модели FullName это метод, а не свойство. AutoMapper автоматически не будет сопоставляться с методами. Согласно conventions вы можете использовать префикс вашего имени метода с Get, чтобы сделать эту работу:

public string GetFullName() 
{ 
    return string.Format("{0} {1}", FirstName, LastName); 
} 

Это будет отображаться на FullName свойства в модели представления. Другой вариант заключается в явном виде объявить, как это делается отображение:

Mapper.CreateMap<Person, PersonViewModel>() 
     .ForMember(
      dest => dest.FullName, 
      opt => opt.MapFrom(src => src.FullName()) 
    ); 

Что касается собственности названия отдела обеспокоена я бы порекомендовал вам изменить свою модель, чтобы вместо DepartmentId собственности он имеет непосредственно свойство, называемое Department, содержащее id и имя, которое позволит вам легко сопоставить их в вашей модели представления. Если вы не можете изменить свою модель таким образом, вы можете иметь свойство Department в модели представления, заполненной непосредственно репозиторием, а не AutoMapper.

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