强类型数据控件(ASP.NET vNext系列)

[原文发表地址] Strongly Typed Data Controls (ASP.NET vNext Series)

[原文发表时间] 2011-09-05 21:58

这是我的ASP.NET vNext系列博客的第二篇。

 

.NET和Visual Studio的vNext版本囊括了许多很棒的新特性和功能。有了ASP.NET vNext你会发现许多Web Form和MVC的很棒的优化,而且ASP.NET作为两者基础的核心,也会有很多进步。

 

这篇博文是我第一篇关于Web Form的优化讨论。在下面的内容中我会介绍新支持的强制输入数据控件。

 

数据控件模板背景

ASP.NET Web Form从第一个版本开始就介绍了“模板”的概念。模板能够让你自定义(或者重写)服务器控件中发出的标记,通常与数据绑定表达式一起使用。

 

当使用模板中的数据连接,你用late-bound表达来绑定数据。比如,下面我们用Eval()辅助函数来进行“FirstName”和“LastName”两个属性的数据绑定,从对象数据连接列表到复述控件:

 

<ul>

    <asp:Repeaterrunat="server" ID="customers">

        <ItemTemplate>

            <li>

                First Name: <%# Eval("FirstName")%><br/>

                Last Name: <%# Eval("LastName")%><br/>

            </li>

        </ItemTemplate>

    </asp:Repeater>

</ul>

 

在进行双向数据绑定时,你会使用Bind()辅助函数,如下所示:

 

<asp:FormView ID="editCustomer" runat="server" >

    <EditItemTemplate>

        <div>

            First Name:

            <asp:TextBoxID="firstName"runat="server"Text='<%# Bind("FirstName") %>'/>

        </div>

        <div>

            Last Name:

            <asp:TextBoxID="lastName"runat="server"Text='<%# Bind("LastName") %>'/>

        </div>

        <asp:Buttonrunat="server"CommandName="Update" />

    </EditItemTemplate>

</asp:FormView>

 

上述方法的一个缺点就是调用Eval()和Bind()是late-bound,这就意味着你要输入字符串来显示属性名称。你不能智能感应成员名称,不支持代码导航(比如转到定义),也不支持编译时检查。

 

强类型数据控件

下一版ASP.NET提供了启用强制输入数据模板的能力。具体来说,我们新增了声明功能,通过数据控件新属性“ModelType”来显示将会绑定到什么类型的数据。设置这个属性会引出两个新类型的变量,在数据绑定模板表达范围内生成,那就是Item和BindItem。

 

开发者可以在数据连接表达中运用这些变量,获取完全智能感应以及编译时检测支持。比如,下面我们在<asp:repeater>控件上设置ModelType,作为“Customer”对象。设置完成之后,我们就能从使用Eval(“FirstName”)替换Item.FirstName来转换成引用属性。

 

我们同时会获取完全的Visual Studio代码智能感应:

 

clip_image001[4]

 

对双向数据绑定表达式来说,我们也可以使用BindItem变量,得到相同的强壮输入益处:

 

<asp:FormView ID="editCustomer" runat="server">

    <EditItemTemplate>

        <div>

            First Name:

            <asp:TextBoxID="firstName" Text='<%# BindItem.FirstName %>'runat="server" />

        </div>

        <div>

            Last Name:

            <asp:TextBoxID="lastName" Text='<%# BindItem.LastName %>'runat="server" />

        </div>

        <asp:Buttonrunat="server"CommandName="Update" />

    </EditItemTemplate>

</asp:FormView>

 

要是我们在输入时出错了,我们会从智能感应引擎中获取即时反馈知道哪里出错了:

 

clip_image002[4]

 

新功能快速视频

Damian Edwards制作了一个90 秒视频,展示了在实际运用中使用强制输入数据控件,你可以点击此处观看。

 

总结

 

对强类型数据控件的支持也许是一个很小的,但却是很精致的一个功能,使得数据绑定表达更简单清晰。在今后的博文中我还会陆续介绍一些我们在ASP.NET vNExt中对Web Form做的一些其他数据改进,让数据编辑和数据连接更加强大简单。

 

希望对你们有帮助。

 

Scott