MVC2 ViewModel Binding - PullRequest
       8

MVC2 ViewModel Binding

3 голосов
/ 14 августа 2010

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

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

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

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

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

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

1 Ответ

1 голос
/ 14 августа 2010

Вы упомянули, что используете AutoMapper . В вашей модели FullName это метод, а не свойство. AutoMapper не будет автоматически сопоставляться с методами. В соответствии с соглашениями вы можете добавить префикс имени вашего метода к 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, содержащее идентификатор и имя, которое позволит вам отобразить их легко по вашему мнению модель. Если вы не можете изменить свою модель таким образом, у вас может быть свойство Department в модели представления, заполненное непосредственно хранилищем, а не AutoMapper.

...