Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc asp.net mvc自动映射解析_Asp.net Mvc_Automapper - Fatal编程技术网

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,查询项目列表,并填充下拉列表
  • 如果列表是特定于上下文的,只需在控制器操作中构造列表

    • 不要为此使用AutoMapper,它不值得。例如,在验证失败并再次显示表单的情况下,此处不执行AutoMapper(通常)。我们通常走两条路线:

      • 如果列表不是特定于上下文的,请创建一个HtmlHelper,用于查询某些ISelectListProvider以获取选择列表项:Html.DropDownList()。您可以使用您选择的IoC容器来定位personListProvider,查询项目列表,并填充下拉列表
      • 如果列表是特定于上下文的,只需在控制器操作中构造列表

      如果有人选择这样做,您可以这样做:

      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模式的看法吗