Asp.net mvc asp.net mvc自动映射解析
假设我们有这样的东西Asp.net mvc asp.net mvc自动映射解析,asp.net-mvc,automapper,Asp.net Mvc,Automapper,假设我们有这样的东西 public class Person { public string Name {get; set;} public Country Country {get; set;} } public class PersonViewModel { public Person Person {get; set;} public SelectList Countries {get; set;} } 是否可以使用automapper将Person解析为Per
public class Person
{
public string Name {get; set;}
public Country Country {get; set;}
}
public class PersonViewModel
{
public Person Person {get; set;}
public SelectList Countries {get; set;}
}
是否可以使用automapper将Person解析为PersonViewModel并返回?听起来您希望通过PersonViewModel将Person发送到视图,该模型包含生成和返回新(或更新)Person对象所需的所有额外信息 如果这是正确的,我认为你根本不需要automapper。根据我对automapper的理解,它用于将相关对象的集合映射到一种更具视图模型类型的状态,但在本例中,您将一个人发送到客户端,并尝试接收一个人返回。在这种情况下,使用视图模型填充页面似乎更容易,但是让页面返回一个人(或者从视图模型中提取更新的人以保存一些击键)
编辑:也就是说,是的,你应该能够使用automapper移动信息。对于这个简单的场景来说,这只是一个不必要的层。听起来您想通过PersonViewModel将一个人发送到视图,该视图包含生成和返回新(或更新)的Person对象所需的所有额外信息 如果这是正确的,我认为你根本不需要automapper。根据我对automapper的理解,它用于将相关对象的集合映射到一种更具视图模型类型的状态,但在本例中,您将一个人发送到客户端,并尝试接收一个人返回。在这种情况下,使用视图模型填充页面似乎更容易,但是让页面返回一个人(或者从视图模型中提取更新的人以保存一些击键)
编辑:也就是说,是的,你应该能够使用automapper移动信息。对于这个简单的场景来说,这只是一个不必要的层。不要为此使用AutoMapper,它不值得。例如,在验证失败并再次显示表单的情况下,此处不执行AutoMapper(通常)。我们通常走两条路线:
- 如果列表不是特定于上下文的,请创建一个HtmlHelper,用于查询某些ISelectListProvider以获取选择列表项:Html.DropDownList()。您可以使用您选择的IoC容器来定位personListProvider,查询项目列表,并填充下拉列表
- 如果列表是特定于上下文的,只需在控制器操作中构造列表
- 如果列表不是特定于上下文的,请创建一个HtmlHelper,用于查询某些ISelectListProvider以获取选择列表项:Html.DropDownList()。您可以使用您选择的IoC容器来定位personListProvider,查询项目列表,并填充下拉列表
- 如果列表是特定于上下文的,只需在控制器操作中构造列表
- 不要为此使用AutoMapper,它不值得。例如,在验证失败并再次显示表单的情况下,此处不执行AutoMapper(通常)。我们通常走两条路线:
public class Person
{
public string Name {get; set;}
public Country Country {get; set;}
public Country[] GetCountries
{
... add method for countries here
}
}
然后在ViewModel中,您可以让选择列表从该集合中提取数据
public class PersonViewModel
{
public Person Person {get; set;}
public Country[] Countries {get; set;}
public SelectList Countries { get{ .. add new select list code here getting vals from Countries..}}
}
同样,这适用于上下文敏感列表。然而,你在这里有点糊涂(一个人应该得到一份国家名单吗?如果有人愿意,你可以这样做:
public class Person
{
public string Name {get; set;}
public Country Country {get; set;}
public Country[] GetCountries
{
... add method for countries here
}
}
然后在ViewModel中,您可以让选择列表从该集合中提取数据
public class PersonViewModel
{
public Person Person {get; set;}
public Country[] Countries {get; set;}
public SelectList Countries { get{ .. add new select list code here getting vals from Countries..}}
}
同样,这适用于上下文敏感列表。然而,你在这里有点困惑(一个人应该得到一份国家列表吗?是的,这是可能的,但国家来自哪里?我有类似CountryService的东西。GetCountries()是的,这是可能的,但国家来自哪里?我有类似CountryService的东西。GetCountries()实际上我做过类似的事情,但是ppl说这是错误的,在您接受的答案中,问题2指的是您在视图模型中包含了SelectListItem枚举(这使您的控制器实现视图特定的信息)。要修复它,您需要做的更改是将其设置为IEnumerable(或者可能是某个国家类型而不是字符串),以便您的视图可以决定如何显示该信息。传递一个选择列表意味着关于视图应该如何显示数据的信息,这与MVC的想法背道而驰。事实上,我做过类似的事情,但ppl说这是个坏问题。在您接受的答案中,问题2指的是您在视图模型中包含了SelectListItem枚举(这使您的控制器实现视图特定的信息)。要修复它,您需要做的更改只是将其设置为IEnumerable(或某些国家/地区类型,而不是字符串)因此,您的视图可以决定如何显示该信息。传递选择列表意味着有关视图应如何显示数据的信息,这与MVC的理念背道而驰。您能告诉我您对该ViewModel模式的看法吗?您能告诉我您对该ViewModel模式的看法吗