AutoMapper是使用FormView进行双向数据绑定的可行替代方案吗?

时间:2010-03-18 14:26:27

标签: c# asp.net vb.net automapper

我已经开始使用FormView控件在asp.net webforms中启用双向数据绑定。我喜欢它让我省去了在每个页面上编写loadForm和unloadForm例程的麻烦。所以当我刚开始使用文本框时,它似乎很好地开始工作....但是当它开始将一些文件转换为DropDownLists时,所有的一切都输了。例如,请参阅: Not possible to load DropDownList on FormView from code behind? ....之后我还有很多其他问题。

所以我碰巧发表了一篇关于AutoMapper的文章,我对此知之甚少,但从它的声音来看,这个可能是将表单双向数据绑定到域的可行替代方法实体对象?据我所知,AutoMapper基本上运行命名约定,因此,它将在源和目标对象上查找匹配的名称属性(?)。

所以,基本上,我的所有域实体(即:Person)都有属性(FirstName,LastName,Address等)....我希望能够做的是声明我的asp控件(文本框,下拉列表等)具有完全相同的名称,并让automapper执行加载和卸载。

因此,如果这样做,一个人可以完全摆脱被诅咒的FormView控件,它只是绑定和取消绑定webform的一行。

(是的,当然,如果我使用的是MVC,我就不会遇到这些问题,我知道)。

警告1 :AutoMapper必须知道每个控件类型的正确属性名称(控件本身将具有相同的ID实体上的属性,但行为将取决于控件类型),即:

Person.FirstName - > form.FirstName。的。文本
Person.Country - > form.Country。的的SelectedValue
Person.IsVerified - > form.IsVerified。已检查

....所以它必须有聪明才能找到窗体上的控件,确定它的类型,然后在域对象和webform控件之间加载/卸载到控件的适当属性。

警告2 :嵌套控件 - 如果一个可以将一个webform传递给AutoMapper(我还不知道你是否可以),那么事情会更复杂/ destination控件不一定在webform的根目录中,因此必须能够对传递的webform上的所有子控件执行递归搜索(这很容易),返回所有有效UI元素类型实例的集合。

警告<3> 警告3 :用户控件UI元素不公开 - 在遍历#2中的嵌套控件层次结构时,如果您使用的是用户控件,则不公开公开其包含的元素(不对其进行硬编码)因此,必须为当前AutoMapper集合中的每个元素执行FindControl。这个似乎是一个潜在的交易破坏者....    a)性能可能非常差(尽管如果找到用户控件,它可以传递到队列的后面,只在必要时才处理)
   b)在单个map函数中,如何在当前映射函数中引用当前映射元素的所有兄弟

任何想法??

更新

从我读过的内容来看,这似乎是人们不得不走下去的道路:

http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters&referringTitle=Home
http://msdn.microsoft.com/en-us/library/ayybcxe5%28VS.71%29.aspx

1 个答案:

答案 0 :(得分:3)

我认为您最好的长期解决方案是检查WebForms MVP - 如果您无法切换到MVC环境,它会提供比WebForms更好的抽象层。然后,您可以更轻松地映射时间,并获得MVP模式的好处。