细细品味ASP.NET

asp.net

ASP现在被从头到脚地重建了,结果就是ASP.NET。它并不只是ASP 4.0,它是一个用于 Web开发的全新框架,其中包含了许多新的特性。ASP.NET提供了更易于编写、结构更清晰的代码,这些代码很容易进行再利用和共享;ASP.NET使用编译后的语言,从而提升性能和伸缩性;ASP.NET使用Web表单使开发更直观,利用面向对象技术促进组件的再利用。另外,ASP.NET中还包括有页面事件、Web控件、缓冲技术以及服务器控件和对数据捆绑的改进。供 ASP.NET使用的库以及在Microsoft.NET框架中允许通过Web 使用客户商用函数,为程序员提供了更多新的开发机会。

 

ASP.NET的优势

 

ASP.NET使代码更加干净。现有的ASP 应用程序中,不管你将它们写得怎么样,结构总是充满了长长短短的代码。而ASP.NET的代码不仅更容易编写,而且更加干净整洁,比ASP代码更易于阅读。同时,ASP.NET代码的结构方式提高了其再利用性和共享性。

ASP.NET 改进了配置、伸缩性、安全性和可靠性。对于简单的ASP应用程序,配置其实并不算什么问题,但是当你移植到一个利用组件的N层结构中时就会遇到问题。当你对这些应用程序进行配置和维护时,DLL 陷阱问题(组件注册、版本、锁定的DLL等等)就会出现。ASP.NET中则取消了组件注册以及DLL锁定,全面使用了XML配置文件,从而解决了这个问题。这样你只需要执行复制文件的工作就能配置一个Web应用程序。

ASP.NET对各种不同的浏览器提供了更好的支持。对于ASP开发人员来说,浏览器兼容问题好象是一个永恒的问题。你或者为低一级的浏览器编写代码,例如用HTML 3.2,或者限制页面的浏览范围。无线应用程序协议WAP设备的引入还会深化这个问题。本文中Web表单这部分描述了ASP.NET是如何解决浏览器兼容性问题的。

ASP.NET 造就了一类新的Web应用程序。目前的Web应用程序通常都是同一种模式:一套线性应用程序,然后将逻辑植入其中之一。ASP.NET允许开发人员打破这种单一模式,创造出更加动态而且伸缩性更强的应用程序,这种应用程序能够更好地满足公司的商业需求,并提供一个更加丰富的开发环境。

到这里你可能会想,虽然这些目标都很高尚,但是它们会使编写应用程序变得困难。然后恰恰相反,用ASP.NET 进行开发要简单得多!

下面我们就来细细品味一下ASP.NET的强大特征,包括:

 ●对编译语言的支持

 ●Web表单

 ●跟随页面对象的页面事件

 ●Web控件

 ●Web Services

 ●缓冲技术

 ●调试和跟踪

 ●代码和内容隔离

 ●名称空间的通用库

 ●配置

 

使用经过编译的语言

 

现有的ASP版本是基于脚本语言的,如VBScript和JScript 。脚本语言本身并没有什么错,但是它们有两大缺陷:它们是解释型的,并且分类不严格。ASP.NET并没有完全抛弃脚本语言的概念,它引入了对全编译语言的支持,使你能够用Visual Basic编写自己的服务器端代码,例如:

<script language=“vb” runat=“server”>

Visual Basic的一大优势是其对严格分类变量的支持,因此以下的代码在ASP.NET中是成立的:

Dim FirstName As String

除了Visual Basic和C++,你还可以使用最新的Microsoft语言 C#来编写服务器端代码。C# 将C++ 中不实用的部分都去掉了,它更容易理解。用ASP.NET,编译动作在页面第一次装载时发生。即便代码是脚本语言,它也会在执行前被编译,因此 Jscript代码页面的性能也会得到提高。实际上,这是 .NET 框架的一个基本的新特征。以前版本的语言编译器对数据类型和对象是区别对待的,这就意味着唯一可以进行跨语言开发的就是创建COM对象。Microsoft .NET框架中的通用语言运行时间环境CLR允许对已经用通用运行时间支持编译过的任何代码进行紧密的交互作用,这就是新的Visual Basic和C# 编译器将要做的:创建能在运行时间中被管理的代码。

这样做最大的优点是使得真正的跨语言开发成为可能。有了通用运行时间环境CLR,你可以用C#创建对象,并在 Visual Basic中通过继承功能对它们进行扩展。现在的 Visual Basic .NET支持继承功能,这样你就可以在C# 中编写组件,然后在Visual Basic中将它们设置成子集。虽然 Visual Basic、C#和脚本语言是在开始的框架结构中被支持的语言,但是稍后其它语言,如Smalltalk、Eiffel、Pascal等等,也将会被支持。Microsoft .NET框架的一个优势就是扩展非常得容易,因此使用一种新的语言仅仅需要为运行时间环境兼容的输出提供编译器支持。

Web表单

ASP.NET Web Forms就是Web页面,同现在你用 ASP编写代码所做的工作是一样的。但是还不仅仅如此,ASP.NET Web Forms是在一个面向对象的编程模型上设计的,这样代码就能够再利用,并且使应用程序代码与页面内容分隔开。在Visual Basic中,你将一个控件拖曳到一个表单上,然后执行其下的事件程序。在传统的 ASP中,这是不可能的,因为在用户界面控件和它们的服务器端代码之间没有链接存在。但是在ASP.NET中,这样的一个链接是存在的。所以,你可以编写下面表1所示的代码,而不用手动从变量表中拖出值:

表1 简单ASP.NET Web Form例程

<html>

<script language=“vb” runat=“server”>

Sub SubmitButton_Click(Source As Object, E As EventArgs)

Response.Write (ÒYou entered Ò & Name.text)

End Sub

</script>

<body>

<form method=“post” runat=“server”>

Name: <asp:textbox id=“Name” runat=“server” /><br>

<asp:Button text=“Enter”

OnClick=“SubmitButton_Click” runat=“server” />

</form>

</body>

</html>

在表1中有两点值得注意。第一是在表单上 runat=“server” 属性和 asp:textbox控件的使用,这可以告诉 ASP.NET 服务器和客户都可以使用这些控件。如此使用的控件叫做服务器控件。asp: 用做控件名的前缀,它本身就识别了控件是从哪来的。稍后我将讨论这一点。第二个需要注意的细节是OnClick事件。开发DHTML 代码时,你经常要用到 OnClick事件,这是为了在浏览器中激活一个事件。因为为控件设置了runat=“server” 属性,所以事件只在服务器上被激活。要对这个例子进行扩展,可以去掉 Response.Write,然后用一个基于服务器的控件来代替它,比如下面的表2代码:

表2 使用基于服务器的控件

<html>

<script language=“vb” runat=“server”>

Sub SubmitButton_Click(Source As Object, E As EventArgs)

YouEntered.Text = ÒYou entered Ò & txtName.text

End Sub

</script>

<body>

<form method=“post” runat=“server”>

Name: <asp:textbox id=“txtName” runat=“server” /><br>

<asp:Button text=“Enter”

OnClick=“SubmitButton_Click” runat=“server” />

<br>

<asp:label id=“YouEntered” runat=“server”></span>

</form>

</body>

</html>

这个代码运行相当好,很象一个传统的客户或Visual Basic表单,代码也直观多了。你可以用服务器控件来连接事件过程和基于服务器的代码。这些基于服务器的控件向浏览器发送纯 HTML内容,其中不再含有客户端脚本。实际上,这其中一个重要的设计目的就是要坚持使用固有的 HTML 3.2元素代码以提供最大可能的浏览器兼容性。比如说,表2中的代码生成了以下HTML:

<html>

<body>

<FORM name=“HtmlForm2" method=“post” action=“Test.aspx” id=“HtmlForm2">

<INPUT type=“hidden” name=“__VIEWSTATE” value=“a0z664351470__x”>

Name: <input name=“txtName” type=“text” id=“txtName”><br>

<input type=“submit” name=“Button5" value=“Enter”>

<br>

<span id=“lblYouEntered”></span>

</FORM>

</body>

</html>

生成的代码是符合 HTML 3.2标准的。它执行一个标准投递,将用户输入发送回同一个文件。这里没有对服务器状态进行维护,也没有客户端脚本对状态进行维护。隐含的域执行对控件状态的维护,这意味着在页面的“提交-返回”之间,控件能自动恢复状态,而不需要任何编程干预。虽然 ASP.NET Web控件的默认输出是符合HTML 3.2标准的内容,但是对于更高级的浏览器如Microsoft Internet Explorer 5.0,也可以输出为DHTML格式。这样你就能只使用一套服务器控件来编写页面,允许控件根据浏览器决定发送哪种类型的输出,从而允许你将发送 DHTML的控件和客户端脚本用到最新版本的Internet Explorer中,将纯 HTML 3.2内容发送到其它浏览器中。

页面事件

在此前我提到 ASP.NET已经被从头到脚地重写了,但是我并没有指出它是按照面向对象的思路重建的。在对象树的顶部是Page对象,即页面对象,ASP.NET的每个控件、应用程序和页面都是从这个对象中继承来的,也就是说每个页面都是页面对象的一个例示。页面的Load (装载)事件是一个非常重要的事件,如下面的表3代码所示:

表3 使用页面事件

<html>

<script language=“VB” runat=“server”>

Sub Page_Load(Source As Object, E As EventArgs)

‘ code to run when page loads

End Sub

Sub SubmitButton_Click(Source As Object, E As EventArgs)

‘ code to run when button is clicked

End Sub

Sub Page_Unload(Source As Object, E As EventArgs)

‘ code to run when page unloads

End Sub

</script>

<form runat=“server”>

<asp:Button text=“Enter” OnClick=“SubmitButton_Click” runat=“server” />

<asp:label id=“YouEntered”/>

</form>

</html>

在这里你看到了以前在Visual Basic中经常见到的同样的 Load/Unload (装载/卸载)过程。 当页面被装载时,Load事件被激活,这时所有基于服务器的控件都可用。在与用户的交互作用过程中会生成其它事件。最后,当页面被卸载时激活 Unload事件。

Web控件

你可能会担心,象 <asp:TextBox>这样的控件代表了一套需要你熟练运用的全新控件。不过,它们并不难学,因为它们在HTML中都有对应者。例如,对于一个很简单的文本框,在HTML 中,你是这样做的:

<input type=“text” value=“Your Name”></input>

而相应的Web 控件是这样的:

<asp:TextBox Text=“Your Name” runat=“server” />

在这两者中,你立刻就能注意到的是Web 控件通过代码“asp:”名称空间来识别,并且同在XML中一样,使用斜线来结束元素。你不是必须使用XML的格式,你也可以使用HTML格式,用一个分号来结束标记:</asp:TextBox>。但是你会发现,XML格式被用在许多代码举例中,并且代码字数也较简洁。名称空间必须要使用,它负责识别文本框TextBox 控件来自哪里。所有的标准Web控件都是 ASP名称空间的一部分。当编写自己的控件时,这一点变得很重要。

TextBox控件相对于标准的输入框好象没有多少优势,但是你应该考虑一下面的三个输入控件:

<input type=“text” ...>

<input type=“password” ...>

<textarea rows=“5" ...>

它们都是用于HTML输入的,但是并没有一致性。但是如果使用下面的,是不是更简单一些呢?

<asp:TextBox runat=“server” ...>

<asp:TextBox TextBoxMode=“Password” ...>

<asp:TextBox Rows=“5" ...>

你可以看到,一个简单控件包含了HTML中三个控件的功能,而且更易记忆、更易编码。

ASP.NET携带了5大类 Web控件:

• 与HTML相对应的固有控件

• 在页面上提供数据流的列表控件

•提供更丰富的UI(用户界面)内容和功能的Rich控件

• 完成各种表单验证的确认控件

• 为 WAP设备封装WML的移动控件

固有的服务器控件与 HTML控件相同,但是更加合理了,可提供更为一致的用途。这些控件包括LinkButton(链接按钮)、ImageButton(图象按钮)、HyperLink(超级链接)、TextBox(文本框)、CheckBox(复选框)、RadioButton(单选框)、DropDownList(下拉列表)、ListBox(列表框)、Image(图象)、Label(标签)、Panel(面板)、Table(表格)、TableRow(表格行)、TableCell(表格单元)。

列表控件包括Repeater(转发器)、DataList(数据列表)和DataGrid(数据栅格)。列表控件还包括RadioButtonList(单选框列表)和 CheckBoxList(复选框列表),这样就使创建单选框和复选框的列表变得简单。

Rich控件包括Calendar(日历)和AdRotator(广告旋转)。Calendar控件为低级的浏览器输出纯HTML,为高级浏览器输出DHTML(如 Internet Explorer 5.0)。AdRotator输出图象,它有内置的旋转代码。

确认控件包括RequiredFieldValidator(请求域确认)、 Compare Validator(比较确认)、RangeValidator(范围确认)、RegularExpressionValidator(规范表达确认)、CustomValidator(顾客确认)和ValidationSummary(确认摘要)。这些控件为开发人员在表单处理中建立确认提供了简单的途径。

有关移动控件的信息现在还没有发布,但是可以肯定它们有助于构造激活WAP的Web站点。

编写新的控件

你并不一定只局限于使用这些系统提供的控件,自己编写控件也相当简单。例如,如果想要一个控件来封装两个文本框(可能是名和姓的输入域),就可以这样来编写代码:

<asp:Panel runat=“server”>

<asp:Textbox id=“txtFirstName” text=“First Name” runat=“server” />

<asp:Textbox id=“txtLastName” text=“Last Name” runat=“server” />

</asp:Panel>

可以把这个代码保存在文件 Name.aspc (注意这个新扩展名)中,并将其作为一个Web表单控件来对待。接着,就可以向 Web表单中增加以下内容:

<%@ Register TagName=“NameControl” TagPrefix=“Foo” Src=“Name.aspc” %>

<form>

<foo:NameControl runat=“Server”/>

</form>

这样你就可以很容易地创建可以再利用的控件了。这真实很美好 ;-) 你还可以直接在Visual Basic或 C#中创建控件,允许它们成为其它控件的子类,并且呈现任何它们所要求的输出。因为控件是用名称空间来识别的,因此在控件之间应该是没有冲突的。实际上,控件甚至可以使用同一个名字,只要它们在不同的名称空间中就行。你会感觉到,这使得 ASP.NET非常具有扩展性,并且使编程环境变得越来越丰富。实际上有一个很大的提供丰富控件的第三方市场。

数据捆绑控件

新的Web控件之一是数据栅格DataGrid,这是用于显示成套数据的内置支持控件。为了从SQL生成的数据中产生一个 HTML表格,你只需要创建 ADO+对象,并执行指令来获取数据以作为栅格的数据源,比如下面的表4代码:

表 4 DaveSGrid1.aspx

<%@ Import Namespace=“System.Data.SQL” %>

<html>

<script language=“VB” runat=“server”>

Sub Page_Load(Sender As Object, E As EventArgs)

Dim myCommand As SQLCommand

myCommand = New SQLCommand(Òselect * from products”,

ÒServer=localhost; Database=AdvWorks; UID=sa”)

DataGrid1.DataSource = myCommand.Execute

DataGrid1.DataBind

End Sub

</script>

<body>

<ASP:DataGrid id=“DataGrid1" runat=“server” />

</body>

</html>

所需要做的就是将数据捆绑到数据栅格,然后就生成了一个整洁的HTML表格:

数据捆绑并不局限于来自数据库的数据,你还可以捆绑到hash表格、数组、其它服务器控件、页面的适当层,几乎什么都可以。如果默认的栏目不合适,还可以对其进行定制,让其显示你所感兴趣的部分:

<asp:DataGrid id=“DataGrid1"

AutoGenerateColumns=“false” runat=“server”>

<property name=“Columns”>

<asp:BoundColumn HeaderText=“ Name” DataField=“ProductName”/>

<asp:BoundColumn HeaderText=“Description”

DataField=“ProductDescription”/>

</property>

</asp:DataGrid>

使用 BoundColumn 控件选择一个简单的栏目,并指定栏的标题和这栏要捆绑到哪里。 AutoGenerate=“false” 属性负责确保栅格不会为你创建所有的栏目。如果想更复杂一些,也可以为这个栏目使用一个模板。

此前提到的Repeater和DataList控件也支持模板,这样就允许对控件的外观进行定制。Repeater实际上并没有外观,你必须要提供 UI,这就意味着必须要使用一个模板。相反,DataList控件是一个捆绑到数据的列表,有一个默认的外观和丰富的行为。为这两个控件添加模板的方法是一样的:

<asp:DataList is=“DataList1" runat=“server”>

<template name=“HeaderTemplate”>

Here”s your list of titles<br>

</template>

<template name=“ItemTemplate”>

<%# DataBinder.Eval(Container.DataItem, “Title”) %> <br>

</template>

</asp:DataList>

有了这个模板template,你就可以指定用哪些 HTML控件来组成数据捆绑控件的每一部分。有5个模板的名字可以与 DataList控件一起使用:HeaderTemplate用于控件的最顶端部分,ItemTemplate 用于各个项目,Alternating-Item-Template用于其它项目,SeparatorTemplate用于各个项目之间的区域,FooterTemplate用于控件的底部。

这个系统的好处在于:对于如何显示界面,有大量的控件可以使用。进一步使用产品列表,你就能用表7中的代码来生成下图所示的输出:

表 7 DaveSGrid2.aspx

<asp:DataList id=“MyDataList” RepeatColumns=“2" runat=“server”>

<template name=“itemtemplate”>

<table cellpadding=10 style=“font: 10pt verdana”>

<tr>

<td width=1 bgcolor=“BD8672"/>

<td valign=“top”>

<img align=“top”

src=“<%# DataBinder.Eval(Container.DataItem,“ProductImageURL”) %>“ >

</td>

<td valign=“top”>

<b>Name: </b>

<%# DataBinder.Eval(Container.DataItem,”ProductName”) %><br>

<b>Description: </b>

<%# DataBinder.Eval(Container.DataItem,“ProductDescription”) %><br>

<b>Price: </b>

<%# DataBinder.Eval(Container.DataItem,”ProductPrice”, “$ {0}”) %>

</td>

</tr>

</table>

</template>

</asp:DataList>

这个代码相当简单,除了前面显示的 DataList代码外,不再需要更多的东西。代码里有一点值得注意,就是你可以规定出现的栏数,列表会自动处理栏的包装。这样就只需要一点格式化代码,Web页面就得到了极大的改进,而不再使用以前Web 页面上的传统栅格。

开发Web Services(Web服务)

在Internet上作为服务发布的软件是 Web Services的核心。 ASP.NET提供了一个 Web Services的基础构造环境,从而使开发人员能够为这个服务模型创建服务。

现在我们来跟踪一个简单的例子。比如说你要从一个在线书商那里购买书籍,他们有一个跟踪系统,使你能够看到自己定单的状态。书商用一个陆地运输公司来运输你订的货。这个运输公司也有一个跟踪系统。这样,为了得到你的定单的确切状态,你要查看两个站点。如果书商能够将它自己的定单状态和运输公司的状态信息一同显示出来,就会很方便。

Web Services就允许你在Web上将客户商用函数暴露给公众,例如包裹跟踪细节。编写一个对象,将其方法作为URI暴露出来,URI返回一个XML数据。现在书商可以调用运输公司的跟踪服务,并将跟踪的结果合并到它自己的定单跟踪应用程序中。以下是运输公司如何用 C#创建一个服务的代码:

<%@ WebService language=“c#” %>

using System.Web.Services;

public class Shipping {

[WebMethod]

public String OrderStatus(String OrderNumber) {

// code here to retrieve order details from data store

return Status;

}

}

以上代码保存于 Tracking.asmx文件中,位于运输公司 Web站点的应用程序目录中。这样书商就可以使用多种方法来调用这个 Web Services了。比如使用 HTTP-GET,参数同查询字符串一同被传递:

http://orders.ups.com/orders/Tracking.asmx/OrderStatus?OrderNumber=BRU123

书商还可以使用 HTTP-POST,方法的参数作为表单值在post体内传递。或者还可以使用HTTP-SOAP,方法的参数被包裹在一个工业标准 XML格式中。

现在用户只需要在书商那里查询他们的定单细节,书商的 Web 应用程序就会从运输公司那里收集跟踪信息,然后同书的状态一起返回。书商也可以将它的定单状态细节作为一个Web Services暴露出来,让其它人使用它。

Web Services的伟大之处在于,它允许你暴露一个服务而不必暴露数据或所有的商业规则。当自动提供商业服务的同时,代码和数据都是安全的。在以后几年里,随着B2B方案的可利用,Web Services的市场会得到快速的增长。

时间: 2024-09-29 16:31:48

细细品味ASP.NET的相关文章

设计中的细节与思考:百度统计流量研究院细细品味

文章描述:可视化的快乐 – 百度统计流量研究院设计小结. 百度统计流量研究院为了将数据更好的传达给用户,我们采用了动态数据可视化的方式(Interactive Infographic).希望我们的设计能将用户带入到新鲜.愉悦的氛围之中.当然,我们在设计的过程中也体会到了可视化的快乐,并且希望与大家一同分享. 好的流程是成功的一半 预估难度.多部门协作:好的沟通流程是成功的一半.在设计最初,首先应当评估的就是项目开发难度.若开发难度较大,或者说开发人员对于可视化产品的制作经验较少,则最好引入多部门

细细品味“Database2Sharp”生成的Enterprise架构代码

在我上篇文章<利用Database2Sharp生成的EnterpriseLibrary架构的特点 >中,主要介绍了利用该框架如何组建大型的企业应用管理系统,在其中描述了管理系统的各方面,包括:框架的总体设计.权限管理.业务模块管理.菜单管理.工作流管理.通用数据字典管理等各方面,该文章主要是从一个系统框架的宏观方面进行描述,其中并未涉及太多的代码细节.其实自该模版框架诞生以来,本人所有的程序(包括Web和Winform程序),都统一采用Database2Sharp自动生成该框架代码,也包括各种

ASP.NET 2.0 中使用自定义缓存依赖

asp.net|缓存 在 ASP.NET 1.x 中,我们可以使用 CacheDependency 来实现缓存依赖策略,但由于这个类是 sealed 的,我们无法继承这个类来实现我们自己的策略.但是到了 ASP.NET 2.0,我们已经可以从这个类派生出自己的缓存依赖类了. 假定我们要设计一个页面,需要从博客园首页获取最新的贴子信息.为了提高性能,我们希望页面数据仅当博客园首页有更新时才重新生成,否则的话就直接从缓存中获取.如何实现? 一.设计 BlogCacheDependency 类 先分析

如何用jQuery实现ASP.NET GridView折叠伸展效果_jquery

今天做静态页面时有一个需求,就是页面上有一组两个选项的单选按钮和一个有6行的列表(该列表用Table标签实现,不是DIV),当选择单选按钮的选项一时,列表的前三条信息显示后三条信息隐藏,当选择单选按钮的选项二时,列表的前三条信息隐藏后三条信息显示.那么就牵扯出我们今天的话题拉,如何实现呢?实现后该实现还能应用到哪些场景? 1.第一反应的解决方案 碰到这个需求后,我第一反应就是很简单啊,分别用两个DIV将前三个Table中的TR标签与后三个TR标签包起来,然后通过JS控制DIV的显示. 第一步:使

品味.NET巨著——书评《Microsoft .NET框架程序设计(修订版)》

.net框架|程序|设计 在经历了漫长的等待后,我们终于看到了清华大学出版社组织重译的<Microsoft .NET框架程序设计(修订版)>一书.本书英文原名是Applied Microsoft .NET Framework Programming,由全球知名的技术作家 Jeffrey Richter先生所著.在去年<程序员>的.NET好书榜中,我们曾推荐过此书的英文版.一直以来,能透彻地分析.NET框架平台体系和底层技术的书籍了了无几.毫无疑问,<Microsoft .NE

品味精彩大片 看5款大屏高清等离子电视

你还没有购买大屏幕的平板电视?那你还在等什么!!令人激动的暑期电影强档就快到来,当然还有前段时间绝对精彩的DVD影片,这都是你绝对不能够错过的热血之作,下面小米给大家推荐的这10部影片都是万众瞩目的超强片子,有些在国内公映,有些没有在国内公映,有些是即将上映的,不管怎么样,你都应该收藏这些影片DVD,一个人或者和约上亲朋好友在家里细细品味,不过首先你需要一款真正适合看大片的等离子电视?别着急,跟着小米一边品味绝妙精彩的电影,一边体验大屏幕等离子电视带来的震撼吧! [加勒比海盗3]你是不是已经等不

当VS.NET2003遇上VS.NET2005,WebService部署何去何从

web 问题描叙] 重装操作系统之后,部署原来的Web Service出现无法访问.无法调试的问题 [原编程环境] VS.NET2003(.NET Framework 1.1 SP1),Windows XP SP1 [新编程环境] VS.NET2003(.NET Framework 1.1 SP1),VS.NET 2005 Beta1(.NET Framework 2.0 ),Windows XP SP2 [问题解决过程] 因为原来的项目一直使用工具VS.NET 2003,所以虽然VS.NET

async And await异步编程活用基础

原文:async And await异步编程活用基础 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希望大家能有所收获,对async 和 await 的理解有更深一层的理解. async 和 await 有你不知道的秘密,微软会告诉你吗? 我用我自己的例子,去一步步诠释这个技术,看下去,你绝对会有收获.(渐进描述方式,愿适应所有层次的程序员) 从零开始, 控制台 Hello World: 什么?开玩笑吧?拿异步做Hello World?? 下面这个例子,输出什么?猜猜? 1 static

纠正对viewstate的误解

前言        最近在招聘面试的过程中,我经常会问应聘者一些基础的问题,例如:"谈谈你对viewstate的理解".发现很少有人能回答出来.         可能很多人会笑话,这真是个老掉牙的而且没有实际意义的问题,但我就发现很少有人能给出很满意的答复.对于不同的回答,其实是可以推断出回答者的性格和态度的.有的求职者直接这样反驳的回复:"viewstate那是以前asp.net的东西了,现在早就流行用mvc了,谁还用那东西......","会用三层开发