【问题标题】:asp.net mvc automapper parsingasp.net mvc 自动映射器解析
【发布时间】:2009-11-09 15:37:07
【问题描述】:

假设我们有这样的东西

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 并返回?

【问题讨论】:

  • 是的,有可能,但是国家从哪里来?
  • 我有类似 CountryService.GetCountries()

标签: asp.net-mvc automapper


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

听起来您想通过 PersonViewModel 将 Person 发送到视图,其中包含您生成和返回新的(或更新的)Person 对象所需的所有奖励信息。

如果这是正确的,我认为您根本不需要自动映射器。根据我对 automapper 的了解,它用于将相关对象的集合映射到更多视图模型类型的状态,但在这种情况下,您正在向客户端发送一个 Person 并尝试接收一个 Person 返回。在这种情况下,使用您的视图模型来填充页面似乎更容易,但让页面返回一个 Person(或从视图模型中提取更新的 Person 以节省一些击键)。


编辑:话虽如此,是的,您应该能够使用 automapper 来移动信息。对于这个简单的场景,它只是一个不必要的层。

【讨论】:

  • 其实我也做过这样的事情,但是有人说不好stackoverflow.com/questions/1361092/…
  • 您接受的答案中的问题 2 指的是您在视图模型中包含 SelectListItem 枚举(这使您的控制器实现视图特定信息)。修复它需要进行的更改只是使其成为 IEnumerable (或者可能是某些 Country 类型而不是字符串),以便您的视图可以决定如何显示该信息。传递一个选择列表意味着视图应该如何显示数据的信息,这违背了 MVC 的想法。
【解决方案3】:

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

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..}}
}

同样,这适用于上下文相关列表。但是,您在这里有点混淆了问题(一个人应该获得国家/地区列表吗?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多