ASP.NET MVC用下拉列表显示类内容

时间:2011-07-18 12:31:05

标签: asp.net-mvc view controller automapper

在我的NHIbernate(数据库模型)中我有这个:

public class Pers {
    public int Id{ get; set ;}
    public string FirstName{ get; set ;}
    public string LastName{ get; set ;}
    public string City{ get; set ;}
    public int Age{ get; set ;}

    public Role Role{ get; set ;}
}

我有一些dropwon(数据库模式):

public class Role {
    public int Id{ get; set ;}
    public string NL{ get; set ;}
    public string FR{ get; set ;}
}

在我看来,我想使用下拉列表并显示Pers的一些记录(不是全部,在我的真实课程中还有更多属性)。我为Pers创建了一个Dto类,其中包含我需要的字段:

public class PersDto {
    public int Id{ get; set ;}
    public string FirstName{ get; set ;}
    public string LastName{ get; set ;}

    public RoleDto RoleDto{ get; set ;}
}

public class RoleDto {
    public int Id{ get; set ;}
    public string NL{ get; set ;}
    public string FR{ get; set ;}
}

在控制器中:

Mapper.CreateMap<Role, RoleDto>();
myModel.RoleDto = Mapper.Map<Role, RoleDto>(roleListFromDB);

Mapper.CreateMap<Pers, PersDto>();
myModel.PersDto = Mapper.Map<Pers, PersDto>(persFromDB);

public class MyModel{
    public PersDto PersDto{ get; set ;}
    public RoleDto RoleDto{ get; set ;}
}

这是正确的方法吗?或者最好通过创建PersDto

来执行此操作
public class MyModel{
    public string FirstName{ get; set ;}
    public string LastName{ get; set ;} 
    public RoleDto RoleDto{ get; set ;}
}

是否可以使用automapper仅复制某些字段而不是全部?

谢谢,

2 个答案:

答案 0 :(得分:2)

  

这是正确的方法吗?

不,你不应该在控制器中调用Mapper.CreateMap<TSource, TDest>。此方法应仅在AppDomain的整个生命周期内调用一次,最好在Application_Start中调用。

您可以编写映射配置文件:

public class PersonProfile : Profile
{
    protected override void Configure()
    {
        Mapper.CreateMap<Role, RoleDto>();
        Mapper.CreateMap<Pers, PersDto>();
    }
}

然后在Application_Start中配置这些配置文件:

Mapper.AddProfile(new PersonProfile());

最后在你的控制器中只使用Mapper.Map<TSource, TDest>方法:

var myModel = new MyModel();
myModel.RoleDto = Mapper.Map<Role, RoleDto>(roleListFromDB);
myModel.PersDto = Mapper.Map<Pers, PersDto>(persFromDB);
return View(myModel);

答案 1 :(得分:0)

如果你的global.asax太大,你总是可以将命令分割为在启动时执行到其他类/方法,并使用Command pattern从Global调用它们;包括映射。

我们为映射使用单独的映射文件,当我们想忽略属性时,我们使用ignore method on AutoMapper