MVC2 ViewModel绑定

时间:2010-08-13 21:35:05

标签: c# asp.net-mvc asp.net-mvc-2 viewmodel

如何将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; }
}

当我为PersonViewModel生成一个强类型的新“View”并设置为“List”View Content ....时会生成页面,但FullName不会通过。

我创建了PersonDepartment属性,因为我想显示此人所在的部门名称。我有类似的部门类设置。例如,我希望能够执行类似“PersonDepartment.DepartmentName”的操作,在页面上显示部门名称。

我正在使用DBML(Linq To SQL),因此部分类从自动生成的类扩展。

我不确定如何填充FullName属性并传递给ViewModel并获取与传递的Person信息相关的Department属性。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您提到过您正在使用AutoMapper。在您的模型中FullName是一种方法,而不是一种属性。 AutoMapper不会自动映射到方法。根据{{​​3}},您可以使用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填充。