ASP.NET 4.5 和 Visual Studio 2012 的新增功能

本文档介绍 ASP.NET 4.5 中引入的新功能和增强功能。 它还介绍了 Visual Studio 2012 中 Web 开发的改进。 本文档最初于 2012 年 2 月 29 日发布。

ASP.NET Core Runtime 和 Framework

异步读取和写入 HTTP 请求和响应

ASP.NET 4 引入了使用 HttpRequest.GetBufferlessInputStream 方法将 HTTP 请求实体读取为流的功能。 此方法提供了对请求实体的流访问。 但是,它以同步方式执行,该线程在请求的持续时间内绑定线程。

ASP.NET 4.5 支持在 HTTP 请求实体上异步读取流的功能,并支持异步刷新。 ASP.NET 4.5 还使你可以对 HTTP 请求实体进行双缓冲,从而更轻松地与下游 HTTP 处理程序(如.aspx页处理程序和 ASP.NET MVC 控制器)集成。

对 HttpRequest 处理的改进

来自 HttpRequest.GetBufferlessInputStream 的 ASP.NET 4.5 返回的流引用支持同步读取和异步读取方法。 GetBufferlessInputStream 返回的 Stream 对象现在同时实现 BeginRead 和 EndRead 方法。 异步流方法允许异步读取区块中的请求实体,同时 ASP.NET 在异步读取循环的每个迭代之间释放当前线程。

ASP.NET 4.5 还添加了一种配套方法,用于以缓冲方式读取请求实体: HttpRequest.GetBufferedInputStream。 此新重载的工作方式类似于 GetBufferlessInputStream,支持同步读取和异步读取。 但是,在读取时, GetBufferedInputStream 还会将实体字节复制到 ASP.NET 内部缓冲区中,以便下游模块和处理程序仍可访问请求实体。 例如,如果管道中的某些上游代码已使用 GetBufferedInputStream 读取请求实体,则仍然可以使用 HttpRequest.FormHttpRequest.Files。 这样,便可以对请求执行异步处理(例如,将大型文件上传到数据库),但仍在之后运行.aspx页和 MVC ASP.NET 控制器。

异步刷新响应

当客户端远离或具有低带宽连接时,向 HTTP 客户端发送响应可能需要相当长的时间。 通常,ASP.NET 在应用程序创建响应字节时缓冲这些字节。 然后,ASP.NET 在请求处理结束时对累积缓冲区执行单个发送操作。

如果缓冲响应很大(例如,将大型文件流式传输到客户端),则必须定期调用 HttpResponse.Flush ,以便将缓冲输出发送到客户端并控制内存使用情况。 但是,由于 Flush 是同步调用,因此迭代调用 Flush 仍会在可能长时间运行的请求期间使用线程。

ASP.NET 4.5 添加了对使用 HttpResponse 类的 BeginFlush 和 EndFlush 方法异步执行刷新的支持。 使用这些方法,可以创建异步模块和异步处理程序,以增量方式将数据发送到客户端,而无需将操作系统线程绑起来。 在 BeginFlush 和 EndFlush 调用之间,ASP.NET 释放当前线程。 这大大减少了支持长时间运行的 HTTP 下载所需的活动线程总数。

支持 awaitTask - 基于异步模块和处理程序

.NET Framework 4 引入了一个 称为任务的异步编程概念。 任务由 System.Threading.Tasks 命名空间中的任务类型和相关类型表示。 .NET Framework 4.5 以编译器增强功能为基础,使 使用 Task 对象变得简单。 在 .NET Framework 4.5 中,编译器支持两个新关键字: awaitasyncawait 关键字是语法简写,用于指示代码片段应异步等待其他一段代码。 异步关键字表示可用于将方法标记为基于任务的异步方法的提示。

awaitasyncTask 对象的组合使你更轻松地在 .NET 4.5 中编写异步代码。 ASP.NET 4.5 支持通过新的 API 简化这些简化,使你能够使用新的编译器增强功能编写异步 HTTP 模块和异步 HTTP 处理程序。

异步 HTTP 模块

假设你想要在返回 Task 对象的方法中执行异步工作。 下面的代码示例定义了一个异步方法,该方法进行异步调用以下载Microsoft主页。 请注意在方法签名中使用 async 关键字和对 DownloadStringTaskAsyncawait 调用。

private async Task
ScrapeHtmlPage(object caller, EventArgs e)
{
    WebClient wc = new WebClient();
    var result = await wc.DownloadStringTaskAsync("http://www.microsoft.com");
    // Do something with the result
}

只需编写这些内容,.NET Framework 就会在等待下载完成时自动处理展开调用堆栈,以及在下载完成后自动还原调用堆栈。

现在,假设要在异步 ASP.NET HTTP 模块中使用此异步方法。 ASP.NET 4.5 包括帮助程序方法(EventHandlerTaskAsyncHelper)和新委托类型(TaskEventHandler),可用于将基于任务的异步方法与 ASP.NET HTTP 管道公开的较旧的异步编程模型集成。 此示例演示如何:

public void Init(HttpApplication
context)
 {
   // Wrap the Task-based method so that it can be used with 
   // the older async programming model.
   EventHandlerTaskAsyncHelper helper = 
       new EventHandlerTaskAsyncHelper(ScrapeHtmlPage);
 
   // The helper object makes it easy to extract Begin/End methods out of
   // a method that returns a Task object. The ASP.NET pipeline calls the 
   // Begin and End methods to start and complete calls on asynchronous 
   // HTTP modules.
   context.AddOnPostAuthorizeRequestAsync(
       helper.BeginEventHandler, helper.EndEventHandler);
}

异步 HTTP 处理程序

在 ASP.NET 中编写异步处理程序的传统方法是实现 IHttpAsyncHandler 接口。 ASP.NET 4.5 引入了 可从中派生的 HttpTaskAsyncHandler 异步基类型,这使得编写异步处理程序更容易。

HttpTaskAsyncHandler 类型是抽象的,需要重写 ProcessRequestAsync 方法。 在内部 ASP.NET 负责将 ProcessRequestAsync返回签名(任务对象)与 ASP.NET 管道使用的较旧的异步编程模型集成。

以下示例演示如何使用 Taskawait 作为异步 HTTP 处理程序实现的一部分:

public class MyAsyncHandler : HttpTaskAsyncHandler
{
    // ...
     
    // ASP.NET automatically takes care of integrating the Task based override
    // with the ASP.NET pipeline.
    public override async Task ProcessRequestAsync(HttpContext context)
    {
        WebClient wc = new WebClient();
        var result = await 
           wc.DownloadStringTaskAsync("http://www.microsoft.com");
        // Do something with the result
    }
}

新的 ASP.NET 请求验证功能

默认情况下,ASP.NET 执行请求验证 — 它会检查在字段、标头、Cookie 等字段中查找标记或脚本的请求。 如果检测到任何异常,ASP.NET 将引发异常。 这充当针对潜在跨站点脚本攻击的第一道防线。

ASP.NET 4.5 可以轻松选择性地读取未评估的请求数据。 ASP.NET 4.5 还集成了常用的 AntiXSS 库,该库以前是外部库。

开发人员经常要求能够有选择地关闭其应用程序的请求验证。 例如,如果你的应用程序是论坛软件,你可能希望允许用户提交 HTML 格式的论坛帖子和评论,但仍确保请求验证正在检查其他所有内容。

ASP.NET 4.5 引入了两项功能,使你可以轻松地使用未评估的输入:延迟(“延迟”)请求验证和对未评估的请求数据的访问。

延迟(“延迟”)请求验证

在 ASP.NET 4.5 中,默认情况下,所有请求数据都受请求验证的约束。 但是,可以将应用程序配置为延迟请求验证,直到实际访问请求数据。 (这有时称为延迟请求验证,具体取决于某些数据方案的延迟加载等术语。可以将应用程序配置为在 Web.config 文件中使用延迟验证,方法是在 httpRUntime 元素中requestValidationMode 属性设置为 4.5,如以下示例所示:

<httpRuntime requestValidationMode="4.5" ... />

当请求验证模式设置为 4.5 时,仅针对特定请求值触发请求验证,并且仅在代码访问该值时才触发请求验证。 例如,如果代码获取 Request.Form[“forum_post”] 的值,则仅针对表单集合中的该元素调用请求验证。 不会验证 Form 集合中的其他元素。 在以前版本的 ASP.NET 中,访问集合中的任何元素时,会针对整个请求集合触发请求验证。 通过新行为,不同的应用程序组件可以更轻松地查看不同的请求数据片段,而无需在其他部分触发请求验证。

支持未评估的请求

仅延迟请求验证并不能解决有选择地绕过请求验证的问题。 对 Request.Form[“forum_post”] 的调用仍然触发该特定请求值的请求验证。 但是,你可能希望在不触发验证的情况下访问此字段,因为你想要允许该字段中的标记。

为此,ASP.NET 4.5 现在支持对请求数据的未评估访问权限。 ASP.NET 4.5 包括 HttpRequest 类中新的未验证集合属性。 此集合提供对请求数据的所有常见值(如 FormQueryStringCookieUrl)的访问。

使用论坛示例,若要读取未评估的请求数据,首先需要将应用程序配置为使用新的请求验证模式:

<httpRuntime requestValidationMode="4.5" ...
/>

然后, 可以使用 HttpRequest.Unvalidated 属性读取未评估的表单值:

var s = context.Request.Unvalidated.Form["forum_post"];

警告

安全性 - 谨慎使用未评估的请求数据! ASP.NET 4.5 添加了未评估的请求属性和集合,以便更轻松地访问非常具体的未评估的请求数据。 但是,仍必须对原始请求数据执行自定义验证,以确保不会向用户呈现危险文本。

AntiXSS 库

由于 Microsoft AntiXSS 库的普及,ASP.NET 4.5 现在包含该库 4.0 版的核心编码例程。

编码例程由新的 System.Web.Security.AntiXss 命名空间中的 AntiXssEncoder 类型实现。 可以通过调用在类型中实现的任何静态编码方法,直接使用 AntiXssEncoder 类型。 但是,使用新反 XSS 例程的最简单方法是将 ASP.NET 应用程序配置为默认使用 AntiXssEncoder 类。 为此,请将以下属性添加到 Web.config 文件:

<httpRuntime ...
  encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

当 encoderType 属性设置为使用 AntiXssEncoder 类型时,ASP.NET 中的所有输出编码会自动使用新的编码例程。

这些是已合并到 ASP.NET 4.5 的外部 AntiXSS 库的部分:

  • HtmlEncodeHtmlFormUrlEncodeHtmlAttributeEncode
  • XmlAttributeEncodeXmlEncode
  • UrlEncode 和 UrlPathEncode (新)
  • CssEncode

对 WebSocket 协议的支持

WebSocket 协议是基于标准的网络协议,用于定义如何通过 HTTP 在客户端与服务器之间建立安全实时双向通信。 Microsoft已与 IETF 和 W3C 标准机构合作,以帮助定义协议。 任何客户端(而不仅仅是浏览器)都支持 WebSocket 协议,Microsoft在客户端和移动操作系统上投入大量支持 WebSocket 协议的资源。

WebSocket 协议可以更轻松地在客户端和服务器之间创建长时间运行的数据传输。 例如,编写聊天应用程序要容易得多,因为可以在客户端和服务器之间建立真正的长时间运行连接。 无需采用定期轮询或 HTTP 长轮询等解决方法来模拟套接字的行为。

ASP.NET 4.5 和 IIS 8 包括低级别的 WebSocket 支持,使 ASP.NET 开发人员能够使用托管 API 在 WebSocket 对象上异步读取和写入字符串和二进制数据。 对于 ASP.NET 4.5,有一个新的 System.Web.WebSocket 命名空间,其中包含用于处理 WebSocket 协议的类型。

浏览器客户端通过创建指向 ASP.NET 应用程序中 URL 的 DOM WebSocket 对象来建立 WebSocket 连接,如以下示例所示:

socket = new WebSocket("ws://contoso.com/MyWebSocketApplication.ashx");

可以使用任何类型的模块或处理程序在 ASP.NET 中创建 WebSocket 终结点。 在前面的示例中,使用了 .ashx 文件,因为 .ashx 文件是创建处理程序的快速方法。

根据 WebSocket 协议,ASP.NET 应用程序通过指示请求应从 HTTP GET 请求升级到 WebSocket 请求来接受客户端的 WebSocket 请求。 下面是一个示例:

HttpContext.Current.AcceptWebSocketRequest(// WebSocket delegate goes here)

AcceptWebSocketRequest 方法接受函数委托,因为 ASP.NET 展开当前 HTTP 请求,然后将控制权传输到函数委托。 从概念上讲,此方法类似于使用 System.Threading.Thread,其中定义了执行后台工作的线程启动委托。

ASP.NET 并且客户端成功完成 WebSockets 握手后,ASP.NET 调用委托,WebSocket 应用程序将开始运行。 下面的代码示例演示了一个简单的回显应用程序,该应用程序使用 ASP.NET 中的内置 WebSocket 支持:

public async Task MyWebSocket(AspNetWebSocketContext context)
{
    WebSocket socket = context.WebSocket;
    while (true)
    {
        ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);

        // Asynchronously wait for a message to arrive from a client
        WebSocketReceiveResult result = 
           await socket.ReceiveAsync(buffer, CancellationToken.None);

        // If the socket is still open, echo the message back to the client
        if (socket.State == WebSocketState.Open)
        {
           string userMessage = Encoding.UTF8.GetString(buffer.Array, 0,
               result.Count);
           userMessage = "You sent: " + userMessage + " at " + 
               DateTime.Now.ToLongTimeString();
           buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage));

           // Asynchronously send a message to the client
           await socket.SendAsync(buffer, WebSocketMessageType.Text,
               true, CancellationToken.None);
        }
        else { break; }
    }
}

.NET 4.5 对 await 关键字和基于任务的异步操作的支持自然适合编写 WebSocket 应用程序。 该代码示例显示 WebSocket 请求在 ASP.NET 内完全异步运行。 应用程序通过调用 await 套接字以异步方式等待从客户端发送消息。ReceiveAsync。 同样,可以通过调用 await 套接字将异步消息发送到客户端。SendAsync

在浏览器中,应用程序通过 onmessage 函数接收 WebSocket 消息。 若要从浏览器发送消息,请调用 WebSocket DOM 类型的发送方法,如以下示例所示:

// Receive a string message from the server.
socket.onmessage = function(msg)
{
    document.getElementById("serverData").innerHTML = msg.data; 
};
// Send a string message from the browser.
socket.send(document.getElementById("msgText"));

将来,我们可能会发布对此功能的更新,以抽象化此版本的 WebSocket 应用程序所需的一些低级别编码。

捆绑和缩小

捆绑使你可以将单个 JavaScript 和 CSS 文件合并成一个捆绑包,可以像单个文件一样处理。 缩小通过删除不需要的空格和其他字符来压缩 JavaScript 和 CSS 文件。 这些功能适用于 Web 窗体、ASP.NET MVC 和网页。

捆绑包是使用 Bundle 类或其子类之一 ScriptBundle 和 StyleBundle 创建的。 配置捆绑包实例后,只需将捆绑包添加到全局 BundleCollection 实例即可提供给传入请求。 在默认模板中,捆绑配置在 BundleConfig 文件中执行。 此默认配置为模板使用的所有核心脚本和 css 文件创建捆绑包。

使用几个可能的帮助程序方法之一从视图中引用捆绑包。 为了支持在调试与发布模式下为捆绑包呈现不同的标记,ScriptBundle 和 StyleBundle 类具有帮助程序方法 Render。 在调试模式下,Render 将为捆绑包中的每个资源生成标记。 在发布模式下,Render 将为整个捆绑包生成单个标记元素。 可以通过在 web.config 中修改编译元素的调试属性来实现调试模式和发布模式之间的切换,如下所示:

<system.web>
 <compilation targetframework="4.5" debug="true" />
 ...</system.web>

此外,可以通过 BundleTable.EnableOptimizations 属性直接设置启用或禁用优化。

BundleTable.EnableOptimizations = true;

捆绑文件时,它们首先按字母顺序排序(它们以解决方案资源管理器显示的方式)。 然后组织它们,以便先加载已知库及其自定义扩展(如 jQuery、MooTools 和 Dojo)。 例如,将脚本文件夹捆绑的最终顺序如下:

  1. jquery-1.6.2.js
  2. jquery-ui.js
  3. jquery.tools.js
  4. a.js

CSS 文件也按字母顺序排序,然后重新组织,以便reset.css和normalize.css位于任何其他文件之前。 上面所示的“样式”文件夹捆绑的最终排序将是:

  1. reset.css
  2. content.css
  3. forms.css
  4. globals.css
  5. menu.css
  6. styles.css

Web 托管的性能改进

.NET Framework 4.5 和 Windows 8 引入了可帮助实现 Web 服务器工作负荷显著性能提升的功能。 这包括在启动时间和使用 ASP.NET 的 Web 托管网站的内存占用中减少(高达 35%)。

关键性能因素

理想情况下,所有网站都应处于活动状态且内存中,以确保随时快速响应下一个请求。 可能影响站点响应能力的因素包括:

  • 在应用池回收后,站点重启所需的时间。 这是当站点程序集不再在内存中时启动站点的 Web 服务器进程所需的时间。 (平台程序集仍在内存中,因为它们由其他站点使用)。这种情况称为“冷站点、暖框架启动”或“冷站点启动”。
  • 站点占用的内存量。 此条件是“每站点内存消耗量”或“未共享的工作集”。

新的性能改进侧重于这两个因素。

新性能功能的要求

新功能的要求可以细分为以下类别:

  • 在 .NET Framework 4 上运行的改进。
  • 需要 .NET Framework 4.5 但可在任何版本的 Windows 上运行的改进。
  • 仅适用于在 Windows 8 上运行的 .NET Framework 4.5 的改进。

通过能够启用的每个改进级别提高性能。

一些 .NET Framework 4.5 改进利用适用于其他方案的更广泛的性能功能。

共享通用程序集

要求:.NET Framework 4 和 Visual Studio 11 开发人员预览版 SDK

服务器上的不同站点通常使用相同的帮助程序程序集(例如,初学者工具包或示例应用程序中的程序集)。 每个站点在其 Bin 目录中都有自己的这些程序集的副本。 即使程序集的对象代码相同,但它们在物理上是独立的程序集,因此必须在冷站点启动期间单独读取每个程序集,并在内存中单独保存。

新的间隙功能解决了这种效率低下的问题,减少了 RAM 要求和加载时间。 Interning 允许 Windows 在文件系统中保留每个程序集的单个副本,站点 Bin 文件夹中的各个程序集将替换为单个副本的符号链接。 如果单个站点需要程序集的不同版本,则符号链接将替换为程序集的新版本,并且仅影响该站点。

使用符号链接共享程序集需要一个名为aspnet_intern.exe的新工具,这使你可以创建和管理实习生程序集的存储。 它作为 Visual Studio 11 开发人员预览版 SDK 的一部分提供。 (但是,它将在仅安装 .NET Framework 4 的系统上运行,前提是已安装最新的 更新

为了确保所有符合条件的程序集都已实习生,请定期运行aspnet_intern.exe(例如,每周作为计划任务运行一次)。 典型的用途如下:

aspnet_intern -mode exec -sourcedir
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files" -interndir C:\ASPNETCommonAssemblies

若要查看所有选项,请运行没有参数的工具。

使用多核心 JIT 编译加快启动速度

要求:.NET Framework 4.5

对于冷站点启动,不仅必须从磁盘读取程序集,而且必须编译站点。 对于复杂站点,这会增加严重的延迟。 .NET Framework 4.5 中的新通用技术通过跨可用处理器核心分布 JIT 编译来减少这些延迟。 它通过使用之前启动站点期间收集的信息,尽可能早地执行此操作。 System.Runtime.ProfileOptimization.StartProfile 方法实现的此功能。

默认情况下,使用多个核心的 JIT 编译在 ASP.NET 中处于启用状态,因此无需执行任何操作即可利用此功能。 如果要禁用此功能,请在 Web.config 文件中进行以下设置:

<configuration>
  <!-- ... -->
  <system.web>
<compilation profileGuidedOptimizations="None"  />
  <!-- ... -->

优化垃圾回收以优化内存

要求:.NET Framework 4.5

站点运行后,它使用垃圾回收器(GC)堆可能是其内存消耗的一个重要因素。 与任何垃圾回收器一样,.NET Framework GC 在 CPU 时间(集合的频率和重要性)与内存消耗(用于新对象、释放对象或可用对象的额外空间)之间进行权衡。 对于以前的版本,我们提供了有关如何配置 GC 以实现正确平衡的指导(例如,请参阅 ASP.NET 2.0/3.5 共享托管配置)。

对于 .NET Framework 4.5(而不是多个独立设置),可以使用工作负载定义的配置设置,使以前建议的所有 GC 设置以及为每个站点工作集提供其他性能的新优化。

若要启用 GC 内存优化,请将以下设置添加到 Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config 文件:

<configuration>
  <!-- ... -->
  <runtime>
<performanceScenario value="HighDensityWebHosting"  />
  <!-- ... -->

(如果熟悉以前有关 aspnet.config 更改的指导,请注意此设置将替换旧设置,例如,无需设置 gcServer、gcConcurrent 等。无需删除旧设置。

Web 应用程序的预提取

要求:在 Windows 8 上运行的 .NET Framework 4.5

对于多个版本,Windows 包含一种称为 预提取 技术的技术,可降低应用程序启动的磁盘读取成本。 由于冷启动主要是客户端应用程序的问题,因此此技术尚未包含在 Windows Server 中,它仅包括对服务器至关重要的组件。 预提取功能现已在最新版本的 Windows Server 中提供,可在其中优化单个网站的启动。

对于 Windows Server,默认情况下未启用预提取器。 若要为高密度 Web 托管启用和配置预提取器,请在命令行中运行以下命令集:

sc config sysmain start=auto
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters" /v EnablePrefetcher /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Prefetcher" /v MaxPrefetchFiles /t REG_DWORD /d 8192 /f
net start sysmain

然后,若要将预提取器与 ASP.NET 应用程序集成,请将以下内容添加到 Web.config 文件中:

<configuration>
  <!-- ... -->
  <system.web>
<compilation enablePrefetchOptimization="true" />
  <!-- ... -->

ASP.NET Web 窗体

强类型化数据控件

在 ASP.NET 4.5 中,Web 窗体包括对处理数据的一些改进。 第一个改进是强类型化的数据控件。 对于以前版本的 ASP.NET 中的 Web 窗体控件,可以使用 Eval 和数据绑定表达式显示数据绑定值

<ul>
<asp:Repeater runat="server" ID="customers">
       <ItemTemplate>
           <li>
               First Name: <%# Eval("FirstName")%><br />
               Last Name: <%# Eval("LastName")%><br />
           </li>
       </ItemTemplate>
</asp:Repeater>
</ul>

对于双向数据绑定,请使用 Bind

<asp:FormView runat="server" ID="editCustomer">
<EditItemTemplate>
       <div>
           <asp:Label runat="server" AssociatedControlID="firstName">
               First Name:</asp:Label>
           <asp:TextBox ID="firstName" runat="server"
               Text='<%#Bind("FirstName") %>' />
       </div>
       <div>
           <asp:Label runat="server" AssociatedControlID="lastName">
               First Name:</asp:Label>
           <asp:TextBox ID="lastName" runat="server"
               Text='<%#
Bind("LastName") %>' />
       </div>
       <asp:Button runat="server" CommandName="Update"/>
</EditItemTemplate>
</asp:FormView>

在运行时,这些调用使用反射来读取指定成员的值,然后在标记中显示结果。 此方法可以轻松地将数据绑定到任意、未调整的数据。

但是,此类数据绑定表达式不支持成员名称、导航(如转到定义)或编译时检查这些名称等功能。

为了解决此问题,ASP.NET 4.5 添加了声明控件绑定到的数据的数据类型的功能。 使用新的 ItemType 属性执行此操作。 设置此属性时,数据绑定表达式的范围中提供了两个新的类型化变量: ItemBindItem。 由于变量是强类型化的,因此可以获得 Visual Studio 开发体验的全部优势。

对于双向数据绑定表达式,请使用 BindItem 变量:

<asp:FormView runat="server" ID="editCustomer">
<EditItemTemplate>
       <div>
           <asp:Label runat="server" AssociatedControlID="firstName">
               First Name:</asp:Label>
           <asp:TextBox ID="firstName" runat="server"  
               Text='<%#BindItem.FirstName %>' />
       </div>
       <div>
           <asp:Label runat="server" AssociatedControlID="lastName">
               First Name:</asp:Label>
           <asp:TextBox ID="lastName" runat="server" 
               Text='<%#BindItem.LastName %>' />
       </div>
       <asp:Button runat="server" CommandName="Update"/>
</EditItemTemplate>
</asp:FormView>

ASP.NET 支持数据绑定的 Web 窗体框架中的大多数控件都已更新为支持 ItemType 属性。

模型绑定

模型绑定在 ASP.NET Web 窗体控件中扩展数据绑定,以处理以代码为中心的数据访问。 它合并了 ObjectDataSource 控件的概念和 ASP.NET MVC 中的模型绑定的概念

选择数据

若要配置数据控件以使用模型绑定选择数据,请将控件的 SelectMethod 属性设置为页面代码中方法的名称。 数据控件在页面生命周期中的适当时间调用该方法,并自动绑定返回的数据。 无需显式调用 DataBind 方法。

在以下示例中 ,GridView 控件配置为使用名为 GetCategories 的方法:

<asp:GridView ID="categoriesGrid"
runat="server"
ItemType="WebApplication1.Model.Category"
SelectMethod="GetCategories" AutoGenerateColumns="false">
<Columns>
       <asp:BoundField DataField="CategoryID" HeaderText="ID" />
       <asp:BoundField DataField="CategoryName" HeaderText="Name" />
       <asp:BoundField DataField="Description" HeaderText="Description" />
       <asp:TemplateField HeaderText="# of Products">
           <ItemTemplate><%# Item.Products.Count %></ItemTemplate>
       </asp:TemplateField>
</Columns>
</asp:GridView>

在页面的代码中创建 GetCategories 方法。 对于简单的选择操作,该方法不需要任何参数,并且应返回 IEnumerable IQueryable 对象。 如果设置了新的 ItemType 属性(这将启用强类型化数据绑定表达式,如前面强类型数据控件中所述),则应返回这些接口的泛型版本 - IEnumerable<T>IQueryable T>,其 T 参数与 ItemType 属性的类型匹配(例如 IQueryable<<Category)。>

以下示例演示 GetCategories 方法的代码。 此示例将 Entity Framework Code First 模型与 Northwind 示例数据库配合使用。 该代码通过 Include 方法确保查询返回每个类别的相关问题的详细信息。 (这可确保 标记中的 TemplateField 元素显示每个类别中的产品计数,而无需 n+1 选择

public IQueryable<Category>
GetCategories()
{
    var db = new Northwind();
    return db.Categories.Include(c => c.Products);
}

当页面运行时, GridView 控件会自动调用 GetCategories 方法,并使用配置的字段呈现返回的数据:

显示按类别列出的食品列表的网格视图的屏幕截图。有八种食物类别。

由于 select 方法返回 IQueryable 对象,因此 GridView 控件在执行查询之前可以进一步操作查询。 例如, GridView 控件可以在执行之前向返回 的 IQueryable 对象添加用于排序和分页的查询表达式,以便基础 LINQ 提供程序执行这些操作。 在这种情况下,Entity Framework 将确保这些操作在数据库中执行。

以下示例演示 修改为允许排序和分页的 GridView 控件:

<asp:GridView ID="categoriesGrid"
runat="server"
AutoGenerateColumns="false"
AllowSorting="true" AllowPaging="true" PageSize="5"
ItemType="WebApplication1.Model.Category" DataKeyNames="CategoryID"
SelectMethod="GetCategories"
UpdateMethod="UpdateCategory">
<Columns>
       <asp:BoundField DataField="CategoryID" HeaderText="ID" SortExpression="CategoryID" />
       <asp:BoundField DataField="CategoryName" HeaderText="Name" SortExpression="CategoryName" />
       <asp:BoundField DataField="Description" HeaderText="Description" />
       <asp:TemplateField HeaderText="# of Products">
           <ItemTemplate><%# Item.Products.Count %></ItemTemplate>
       </asp:TemplateField>
</Columns>
<EmptyDataTemplate>No categories found with a product count of 
      <%# minProductsCount.SelectedValue %></EmptyDataTemplate>
</asp:GridView>

现在,当页面运行时,控件可以确保仅显示当前数据页,并且按所选列排序:

显示按类别列出的食品列表的网格视图的屏幕截图。有三类,糖果,调味品和饮料。

若要筛选返回的数据,必须将参数添加到 select 方法。 这些参数将在运行时由模型绑定填充,可以在返回数据之前使用这些参数来更改查询。

例如,假设你想要让用户通过在查询字符串中输入关键字来筛选产品。 可以将参数添加到方法,并更新代码以使用参数值:

public IQueryable<Product>
GetProducts(string keyword)
{
    IQueryable<Product> query = _db.Products;
     
    if (!String.IsNullOrWhiteSpace(keyword))
    {
        query = query.Where(p => p.ProductName.Contains(keyword));
    }
    return query;
}

如果为关键字提供值,然后返回查询结果,则此代码包含 Where 表达式。

值提供程序

前面的示例并不具体说明关键字参数的值来自何处。 若要指示此信息,可以使用参数属性。 对于此示例,可以使用 System.Web.ModelBinding 命名空间中的 QueryStringAttribute 类:

public IQueryable<Product>
GetProducts([QueryString]string keyword)
{
    IQueryable<Product> query = _db.Products;
     
    if (!String.IsNullOrWhiteSpace(keyword))
    {
        query = query.Where(p => p.ProductName.Contains(keyword));
    }
    return query;
}

这指示模型绑定尝试在运行时将查询字符串中的值绑定到 关键字 参数。 (这可能涉及执行类型转换,尽管这种情况并不如此。如果无法提供值并且类型不可为 null,则会引发异常。

这些方法的值源称为值提供程序,以及指示要使用的值提供程序的参数属性称为值提供程序属性。 Web 窗体将包括 Web 窗体应用程序中用户输入的所有典型源的值提供程序和相应属性,例如查询字符串、Cookie、表单值、控件、视图状态、会话状态和配置文件属性。 还可以编写自定义值提供程序。

默认情况下,参数名称用作键来查找值提供程序集合中的值。 在此示例中,代码将查找名为关键字的查询字符串值(例如 ~/default.aspx?keyword=chef)。 可以通过将自定义键作为参数传递给参数属性来指定自定义键。 例如,若要使用名为 q 的查询字符串变量的值,可以执行以下操作:

public IQueryable<Product>
GetProducts([QueryString("q")]string keyword)
{
    IQueryable<Product> query = _db.Products;

    if (!String.IsNullOrWhiteSpace(keyword))
    {
       query = query.Where(p => p.ProductName.Contains(keyword));
    }
    return query;
}

如果此方法位于页面的代码中,则用户可以使用查询字符串传递关键字来筛选结果:

显示“我的 A P 点 Net 应用程序”页上的浏览器的屏幕截图。有两个变量列出了卡琼食品。

模型绑定完成许多任务,否则必须手动编写代码:读取值、检查 null 值、尝试将其转换为适当的类型、检查转换是否成功,最后使用查询中的值。 模型绑定会导致代码少得多,并且能够在整个应用程序中重复使用该功能。

按控件中的值进行筛选

假设你想要扩展示例,让用户从下拉列表中选择一个筛选器值。 将以下下拉列表添加到标记,并将其配置为使用 SelectMethod 属性从其他方法获取其数据:

<asp:Label runat="server" AssociatedControlID="categories"
Text="Select a category to show products for: " />
<asp:DropDownList runat="server" ID="categories"
SelectMethod="GetCategories" AppendDataBoundItems="true"
DataTextField="CategoryName" DataValueField="CategoryID"
AutoPostBack="true">
  <asp:ListItem Value="" Text="- all -" />
</asp:DropDownList>

通常,还将 EmptyDataTemplate 元素添加到 GridView 控件,以便在未找到匹配的产品时控件将显示消息:

<asp:GridView ID="productsGrid"
runat="server" DataKeyNames="ProductID"
AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false"
SelectMethod="GetProducts" >
<Columns>
       <asp:BoundField DataField="ProductID" HeaderText="ID" />
       <asp:BoundField DataField="ProductName" HeaderText="Name"				  
            SortExpression="ProductName" />
       <asp:BoundField DataField="UnitPrice" HeaderText="Unit Price" 
            SortExpression="UnitPrice" />
       <asp:BoundField DataField="UnitsInStock" HeaderText="# in Stock" 
            SortExpression="UnitsInStock" />
</Columns>
<EmptyDataTemplate>
        No products matching the filter criteria were found</EmptyDataTemplate>
</asp:GridView>

在页面代码中,为下拉列表添加新的 select 方法:

public IQueryable<Category>
GetCategories()
{
    return _db.Categories;
}

最后,更新 GetProducts select 方法以采用包含下拉列表中所选类别 ID 的新参数:

public IQueryable<Product>
GetProducts(
[QueryString("q")] string keyword,
[Control("categories")] int? categoryId)
{
    IQueryable<Product> query = _db.Products;
     
    if (!String.IsNullOrWhiteSpace(keyword))
    {
        query = query.Where(p => p.ProductName.Contains(keyword));
    }
    if (categoryId.HasValue && categoryId > 0)
    {
        query = query.Where(p => p.CategoryID == categoryId);
    }
    return query;
}

现在,当页面运行时,用户可以从下拉列表中选择一个类别,GridView 控件会自动重新绑定以显示筛选的数据。 这是可能的,因为模型绑定跟踪选择方法的参数值,并检测回发后是否有任何参数值已更改。 如果是这样,模型绑定会强制关联的数据控件重新绑定到数据。

显示 I D、名称、单价和库存编号的糖果列表的网格视图的屏幕截图。

HTML 编码的数据绑定表达式

现在可以对数据绑定表达式的结果进行 HTML 编码。 将冒号(:)添加到标记数据绑定表达式的 %# 前缀的 <末尾:

<asp:TemplateField HeaderText="Name">
<ItemTemplate><%#: Item.Products.Name %></ItemTemplate>
</asp:TemplateField>

非干扰性验证

现在,可以将内置验证程序控件配置为对客户端验证逻辑使用不显眼的 JavaScript。 这大大减少了在页面标记中内联呈现的 JavaScript 数量,并减小了整个页面大小。 可以通过以下任一方式为验证程序控件配置非干扰性 JavaScript:

  • 通过将以下设置添加到 <Web.config 文件中的 appSettings> 元素,全局:

    <add name="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />
    
  • 通过将静态 System.Web.UI.ValidationSettings.UnobtrusiveValidationMode 属性设置为 UnobtrusiveValidationMode.WebForms (通常在 Global.asax 文件中的 Application_Start 方法中)。

  • 通过将 Page 类的新 UnobtrusiveValidationMode 属性设置为 UnobtrusiveValidationMode.WebForms,单独用于页面。

HTML5 更新

已对 Web 窗体服务器控件进行了一些改进,以利用 HTML5 的新功能:

  • TextBox 控件的 TextMode 属性已更新,以支持新的 HTML5 输入类型,例如电子邮件日期时间等。
  • FileUpload 控件现在支持从支持此 HTML5 功能的浏览器上传多个文件。
  • 验证程序控件现在支持验证 HTML5 输入元素。
  • 具有表示 URL 的属性的新 HTML5 元素现在支持 runat=“server”。 因此,可以在 URL 路径中使用 ASP.NET 约定,如 ~ 运算符来表示应用程序根目录(例如 <,视频 runat=“server” src=“~/myVideo.wmv” />)。
  • UpdatePanel 控件已修复,支持发布 HTML5 输入字段。

ASP.NET MVC 4

ASP.NET MVC 4 Beta 版现在包含在 Visual Studio 11 Beta 版中。 ASP.NET MVC 是利用 Model-View-Controller (MVC) 模式开发高度可测试且可维护的 Web 应用程序的框架。 ASP.NET MVC 4 可以轻松地为移动 Web 生成应用程序,并包括 ASP.NET Web API,这有助于构建可访问任何设备的 HTTP 服务。 有关详细信息,请参阅 ASP.NET MVC 4 发行说明

ASP.NET 网页 2

新功能包括:

  • 新的和更新的网站模板。
  • 使用 验证 帮助程序添加服务器端和客户端验证。
  • 能够使用资产管理器注册脚本。
  • 使用 OAuth 和 OpenID 从 Facebook 和其他网站启用登录。
  • 使用 Maps 帮助程序添加地图
  • 并行运行网页应用程序。
  • 为移动设备呈现页面。

有关这些功能和全页代码示例的详细信息,请参阅 网页 2 Beta 版中的顶级功能。

Visual Web Developer 11 Beta

本部分提供有关 Visual Web 开发人员 11 Beta 版和 Visual Studio 2012 候选版中 Web 开发的改进的信息。

Visual Studio 2010 和 Visual Studio 2012 候选版本之间的项目共享(项目兼容性)

在 Visual Studio 2012 候选发布之前,在较新版本的 Visual Studio 中打开现有项目启动转换向导。 这强制升级项目的内容(资产),并将解决方案升级到不向后兼容的新格式。 因此,转换后,无法在较旧版本的 Visual Studio 中打开项目。

许多客户告诉我们,这不是正确的方法。 在 Visual Studio 11 Beta 版中,我们现在支持使用 Visual Studio 2010 SP1 共享项目和解决方案。 这意味着,如果在 Visual Studio 2012 候选版本中打开 2010 项目,仍可在 Visual Studio 2010 SP1 中打开该项目。

注意

无法在 Visual Studio 2010 SP1 和 Visual Studio 2012 候选发布之间共享几种类型的项目。 其中包括一些较旧的项目(如 ASP.NET MVC 2 项目)或用于特殊用途的项目(如安装项目)。

在 Visual Studio 11 Beta 版中首次打开 Visual Studio 2010 SP1 Web 项目时,以下属性将添加到项目文件中:

  • FileUpgradeFlags
  • UpgradeBackupLocation
  • OldToolsVersion
  • VisualStudioVersion
  • VSToolsPath

升级项目文件的过程使用 FileUpgradeFlags、UpgradeBackupLocation 和 OldToolsVersion。 它们不会影响在 Visual Studio 2010 中使用项目。

VisualStudioVersion 是 MSBuild 4.5 使用的新属性,指示当前项目的 Visual Studio 版本。 由于 MSBuild 4.0 中不存在此属性(Visual Studio 2010 SP1 使用的 MSBuild 版本),因此我们将默认值注入到项目文件中。

VSToolsPath 属性用于确定要从 MSBuildExtensionsPath32 设置所表示的路径导入的正确 .targets 文件。

还有一些与 Import 元素相关的更改。 为了支持 Visual Studio 这两个版本的兼容性,需要进行这些更改。

注意

如果在两台不同计算机上在 Visual Studio 2010 SP1 和 Visual Studio 11 Beta 之间共享项目,并且该项目在 App_Data 文件夹中包含本地数据库,则必须确保两台计算机上安装数据库使用的 SQL Server 版本。

ASP.NET 4.5 网站模板中的配置更改

对在 Visual Studio 2012 候选版本中使用网站模板创建的站点的默认 Web.config 文件进行了以下更改:

  • 在元素中 <httpRuntime>encoderType 属性现在默认设置为使用添加到 ASP.NET 的 AntiXSS 类型。 有关详细信息,请参阅 AntiXSS 库
  • 此外,在元素中 <httpRuntime> ,该 requestValidationMode 属性设置为“4.5”。 这意味着,默认情况下,请求验证配置为使用延迟(“延迟”)验证。 有关详细信息,请参阅 新的 ASP.NET 请求验证功能
  • <modules><system.webServer> 元素不包含属性 runAllManagedModulesForAllRequests 。 (其默认值为 false。)这意味着,如果使用尚未更新到 SP1 的 IIS 7 版本,则可能在新站点中出现路由问题。 有关详细信息,请参阅 IIS 7 中的本机支持以 ASP.NET 路由

这些更改不会影响现有应用程序。 但是,它们可能表示现有网站与使用新模板为 ASP.NET 4.5 创建的新网站之间的行为差异。

IIS 7 中用于 ASP.NET 路由的本机支持

这不是对 ASP.NET 的更改,而是新网站项目的模板更改,如果使用的是未应用 SP1 更新的 IIS 7 版本,则可能会影响你的模板。

在 ASP.NET 中,可以将以下配置设置添加到应用程序以支持路由:

<configuration>
  <system.webServer>
<modules runAllManagedModulesForAllRequests="true">
     <!-- more -->
</modules>
  </system.webServer>
</configuration>

如果 runAllManagedModulesForAllRequests 为 true,则 URL 类似于 http://mysite/myapp/home ASP.NET,即使 URL 上没有 .aspx.mvc 或类似扩展。

对 IIS 7 进行的更新使 runAllManagedModulesForAllRequests 设置变得不必要,并支持本机 ASP.NET 路由。 (有关更新的信息,请参阅Microsoft 支持部门文章:一个更新可用,使某些 IIS 7.0 或 IIS 7.5 处理程序能够处理 URL 未以句点结尾的请求。

如果网站在 IIS 7 上运行并且 IIS 已更新,则无需将 runAllManagedModulesForAllRequests 设置为 true。 事实上,不建议将其设置为 true,因为它会增加请求的不必要的处理开销。 如果此设置为 true,则所有请求(包括.htm.jpg和其他静态文件的请求)也会通过 ASP.NET 请求管道。

如果使用 Visual Studio 2012 RC 中提供的模板创建新的 ASP.NET 4.5 网站,则网站的配置不包括 runAllManagedModulesForAllRequests 设置。 这意味着默认设置为 false。

如果随后在未安装 SP1 的 Windows 7 上运行网站,IIS 7 将不会包含所需的更新。 因此,路由将不起作用,你会看到错误。 如果路由不起作用,可以执行以下操作之一:

  • 将 Windows 7 更新到 SP1,这将将更新添加到 IIS 7。
  • 安装前面列出的Microsoft 支持部门文章中所述的更新。
  • 在该网站的 Web.config 文件中,将 runAllManagedModulesForAllRequests 设置为 true。 请注意,这将给请求增加一些开销。

HTML 编辑器

智能任务

在设计视图中,服务器控件的复杂属性通常具有关联的对话框和向导,以便轻松设置它们。 例如,可以使用特殊对话框将数据源添加到 Repeater 控件或向 GridView 控件添加列

但是,对于复杂属性,这种类型的 UI 帮助在源视图中不可用。 因此,Visual Studio 11 引入了“源”视图的智能任务。 智能任务是 C# 和 Visual Basic 编辑器中常用功能的上下文感知快捷方式。

对于 ASP.NET Web 窗体控件,当插入点位于元素内部时,智能任务在服务器标记上显示为小字形:

显示插入点位于元素内部时,服务器标记为小字形的屏幕截图。

单击字形或按 Ctrl+时,智能任务将展开。 (dot),就像在代码编辑器中一样。 然后,它会显示与设计视图中的“智能任务”类似的快捷方式。

显示“网格视图任务”窗口的屏幕截图。

例如,上图中的智能任务显示 GridView 任务选项。 如果选择“编辑列”,将显示以下对话框:

显示“字段”对话框的屏幕截图。

填写对话框将设置可在设计视图中设置的相同属性。 单击“确定”时,控件的标记将更新为新设置:

显示使用新设置更新的控件的标记的屏幕截图。

WAI-ARIA 支持

编写可访问的网站变得越来越重要。 WAI-ARIA 辅助功能标准定义开发人员应如何编写可访问的网站。 Visual Studio 现在完全支持此标准。

例如, 角色 属性现在具有完整的 IntelliSense:

显示列表中突出显示为“角色”属性的菜单项的屏幕截图。

WAI-ARIA 标准还引入了前缀为 aria 的属性, 使你可以向 HTML5 文档添加语义。 Visual Studio 还完全支持以下 aria- 属性:

显示 aria 属性的屏幕截图。属性列表中选择了 Aria 删除效果。 显示选中了复制的 aria 删除效果属性的屏幕截图。

新的 HTML5 代码片段

为了更快、更轻松地编写常用的 HTML5 标记,Visual Studio 包含许多代码片段。 例如,视频片段:

显示已选择 Visual Studio 视频片段的屏幕截图。

若要调用代码片段,在 IntelliSense 中选择元素时按 Tab 两次:

显示 IntelliSense 中选择的元素文件的屏幕截图。

这会生成一个可以自定义的代码片段。

提取到用户控件

在大型网页中,最好将各个部分移动到用户控件中。 这种形式的重构有助于提高页面的可读性,并可以简化页面结构。

若要简化此操作,在源视图中编辑 Web 窗体页面时,现在可以在页面中选择文本,右键单击它,然后选择“提取到用户控件”:

显示上下文菜单中选中的“提取到用户控件”的屏幕截图。

特性中代码 nugget 的 IntelliSense

Visual Studio 始终为任何页面或控件中的服务器端代码 nugget 提供 IntelliSense。 现在,Visual Studio 还包含用于 HTML 属性中的代码 nugget 的 IntelliSense。

显示列表中选中的“查询字符串”的屏幕截图。

这样可以更轻松地创建数据绑定表达式:

显示所选 Java 脚本字符串编码的屏幕截图。

重命名开始或结束标记时自动重命名匹配标记

如果重命名 HTML 元素(例如,将 div 标记更改为标头标记),相应的开始或结束标记也会实时更改。

显示实时更改的开始和结束标记的屏幕截图。“Heade”一词突出显示。

这有助于避免忘记更改结束标记或更改错误标记的错误。

事件处理程序生成

Visual Studio 现在包括源视图中的功能,可帮助你编写事件处理程序并手动绑定它们。 如果要在源视图中编辑事件名称,IntelliSense 将显示 <“创建新事件>”,这将在页面的代码中创建具有正确签名的事件处理程序:

显示源视图中插入点处的“创建新事件”的屏幕截图。

默认情况下,事件处理程序将使用控件的 ID 来表示事件处理方法的名称:

显示控件的事件处理方法名称的 ID 的屏幕截图。

生成的事件处理程序将如下所示(在本例中为 C# 中):

显示 C 锐化生成的事件处理程序的屏幕截图。

智能缩进

在空 HTML 元素内按 Enter 时,编辑器会将插入点放在正确的位置:

显示两个 H T M L 元素之间的插入点的屏幕截图。

如果在此位置按 Enter,则关闭标记会向下移动并缩进以匹配开始标记。 插入点也缩进:

显示结束标记向下移动并缩进以匹配开始标记的屏幕截图。插入点也缩进。

自动减少语句完成

Visual Studio 中的 IntelliSense 列表现在基于你键入的内容筛选,以便它仅显示相关选项:

显示 IntelliSense 列表中所选的单词映射的屏幕截图。

IntelliSense 还会根据 IntelliSense 列表中的单个字词的标题大小写筛选。 例如,如果键入“dl”,将显示 dl 和 asp:DataList:

显示已选择 d l 的屏幕截图,因为它已键入。

此功能使获取已知元素的语句完成速度更快。

JavaScript 编辑器

Visual Studio 2012 候选版中的 JavaScript 编辑器是全新的,它极大地改善了在 Visual Studio 中使用 JavaScript 的体验。

代码大纲显示

现在会自动为所有函数创建大纲显示区域,使你可以折叠与当前焦点无关的文件部分。

大括号匹配

将插入点放在左大括号或右大括号上时,编辑器将突出显示匹配的括号。

转到定义

使用 Go to Definition 命令可以跳转到函数或变量的源。

ECMAScript5 支持

编辑器支持 ECMAScript5 中的新语法和 API,这是描述 JavaScript 语言的最新版本的标准。

DOM IntelliSense

改进了用于 DOM API 的 IntelliSense,支持许多新的 HTML5 API,包括 querySelector、DOM 存储、跨文档消息传送和 画布。 DOM IntelliSense 现在由单个简单的 JavaScript 文件(而不是本机类型库定义)驱动。 这样可以轻松扩展或替换。

VSDOC 签名重载

现在,可以使用新的 <签名> 元素为 JavaScript 函数的单独重载声明详细的 IntelliSense 注释,如以下示例所示:

function GetOrSet(key, value) {
/// <signature>
///	 <summary>Gets the value</summary>
///	 <param name="key" type="String">The key to get the value for</param>
///	 <returns type="String" />
/// </signature>
/// <signature>
///	 <summary>Sets the value</summary>
///	 <param name="key" type="String">The key to set the value for</param>
///	 <param name="value" type="String">The value to set</param>
///	 <returns type="MyLib" />
/// </signature>
    if (value) {
        values[key] = value;
        return this;
    } else {
        return values[key];
    }
}

隐式引用

现在可以将 JavaScript 文件添加到一个中央列表中,该列表将隐式包含在任何给定 JavaScript 文件或块引用的文件列表中,这意味着你将获得 IntelliSense 的内容。 例如,可以将 jQuery 文件添加到文件中央列表,并且无论是否已显式引用 /// <reference />),都会在任何 JavaScript 块中获取 jQuery 函数的 IntelliSense。

CSS 编辑器

自动减少语句完成

CSS 的 IntelliSense 列表现在基于所选架构支持的 CSS 属性和值进行筛选。

显示键入弧度时在 IntelliSense 列表中为 C S S 选择边框半径的屏幕截图。

IntelliSense 还支持游戏事例搜索:

屏幕截图显示了在 f w 之后选择的字体粗细。

分层缩进

CSS 编辑器使用缩进来显示分层规则,这概述了级联规则的逻辑组织方式。 在以下示例中,选择器 #list 是列表的级联子级,因此缩进。

显示缩进列表示例的屏幕截图。

以下示例显示了更复杂的继承:

显示其他变量列表的屏幕截图。

规则的缩进由其父规则决定。 默认情况下启用分层缩进,但你可以禁用“选项”对话框(菜单栏中的工具、选项):

显示“选项”对话框的屏幕截图。已检查分层缩进。

CSS 黑客支持

对数百个真实 CSS 文件的分析表明 CSS 黑客非常常见,现在 Visual Studio 支持最常用的 CSS 文件。 此支持包括 IntelliSense 和星形的验证以及下划线 (_) 属性黑客:

显示列表中所选高度的屏幕截图。

也支持典型的选择器黑客,以便即使在应用分层缩进时也保持这种缩进。 用于面向 Internet Explorer 7 的典型选择器黑客是将选择器前面加上 *:first-child + html。 使用该规则将维护分层缩进:

显示典型选择器黑客示例的屏幕截图。

供应商特定的架构(-moz-, -webkit)

CSS3 引入了许多在不同时间由不同浏览器实现的属性。 这以前强制开发人员使用特定于供应商的语法为特定浏览器编写代码。 这些特定于浏览器的属性现在包含在 IntelliSense 中。

显示 IntelliSense 中选择 m 的换行的屏幕截图。

注释和取消注释支持

现在可以使用代码编辑器中使用的相同快捷方式(Ctrl+K、C 注释和 Ctrl+K)注释和取消注释 CSS 规则,也可以取消注释。

颜色选取器

在早期版本的 Visual Studio 中,与颜色相关的属性的 IntelliSense 由命名颜色值的下拉列表组成。 该列表已替换为功能齐全的颜色选取器。

输入颜色值时,将自动显示颜色选取器,并显示以前使用的颜色的列表,后跟默认调色板。 可以使用鼠标或键盘选择颜色。

显示以前使用的颜色列表的屏幕截图,后跟默认调色板。

该列表可以展开为完整的颜色选取器。 选取器允许你在移动不透明度滑块时自动将任何颜色转换为 RGBA 来控制 alpha 通道:

在移动不透明度滑块时,通过自动将任何颜色转换为 R G B A 来显示颜色选取器的屏幕截图。

代码片段

CSS 编辑器中的代码片段可以更轻松地更快地创建跨浏览器样式。 许多需要浏览器特定设置的 CSS3 属性现已滚动到代码片段中。

显示 C S 编辑器中的代码段的屏幕截图。选择“轻松”的单词。

CSS 代码片段通过键入显示 IntelliSense 列表的 at-symbol (@)来支持高级方案(如 CSS3 媒体查询)。

显示在 IntelliSense 列表中所选媒体的屏幕截图。

选择 @media 值并按 Tab 时,CSS 编辑器将插入以下代码片段:

显示选择了 1024 p x 的代码片段的屏幕截图。

与代码片段一样,可以创建自己的 CSS 代码片段。

自定义区域

已在代码编辑器中可用的命名代码区域现在可用于 CSS 编辑。 这样可以轻松对相关样式块进行分组。

显示代码编辑器的屏幕截图。使用的样式块用于区域菜单。

当某个区域折叠时,它将显示区域的名称:

显示“菜单”区域已折叠的屏幕截图。

Page Inspector

页面检查器是在 Visual Studio IDE 中呈现网页(HTML、Web 窗体、ASP.NET MVC 或网页)的工具,可用于检查源代码和生成的输出。 对于 ASP.NET 页,页面检查器允许你确定哪些服务器端代码已生成呈现给浏览器的 HTML 标记。

显示 Visual Studio 代码的屏幕截图。右窗格包含源代码,左窗格呈现网页。

有关页面检查器的详细信息,请参阅以下教程:

发布

发布配置文件

在 Visual Studio 2010 中,Web 应用程序项目的发布信息不会存储在版本控制中,并且不设计用于与他人共享。 在 Visual Studio 2012 候选发布中,发布配置文件的格式已更改。 它已生成团队项目,现在可以轻松地利用基于 MSBuild 的生成。 生成配置信息位于“发布”对话框中,以便你可以在发布之前轻松切换生成配置。

发布配置文件存储在 PublishProfiles 文件夹中。 文件夹的位置取决于所使用的编程语言:

  • C#:Properties\PublishProfiles
  • Visual Basic:我的 Project\PublishProfiles

每个配置文件都是 MSBuild 文件。 发布期间,此文件将导入项目的 MSBuild 文件。 在 Visual Studio 2010 中,如果要对发布或包过程进行更改,则必须将自定义项放在名为 ProjectName.wpp.targets 的文件中。 这仍受支持,但现在可以将自定义设置放在发布配置文件本身中。 这样,自定义项将仅用于该配置文件。

现在,还可以利用 MSBuild 中的发布配置文件。 为此,在生成项目时,请使用以下命令:

msbuild.exe project.csproj /t:WebPublish /p:PublishProfile=ProfileName

project.csproj 值是项目的路径,ProfileName 是要发布的配置文件的名称。 或者,可以传入发布配置文件的完整路径,而不是传递 PublishProfile 属性的配置文件名称

ASP.NET 预编译和合并

对于 Web 应用程序项目,Visual Studio 2012 候选发布会在“包/发布 Web 属性”页上添加一个选项,用于在发布或打包项目时预编译和合并网站内容。 若要查看这些选项,请右键单击解决方案资源管理器中的项目,选择“属性”,然后选择“包/发布 Web 属性”页。 下图显示了在发布选项之前预编译此应用程序。

屏幕截图显示,若要查看“包/发布 Web 属性”页的选项,请右键单击解决方案资源管理器中的项目,选择“属性”,然后选择“包/发布 Web 属性”页。

选择此选项后,每当发布或打包 Web 应用程序时,Visual Studio 都预编译应用程序。 如果要控制站点的预编译方式或程序集合并方式,请单击“高级”按钮以配置这些选项。

IIS Express

用于在 Visual Studio 中测试 Web 项目的默认 Web 服务器现在是 IIS Express。 Visual Studio 开发服务器仍然是开发期间本地 Web 服务器的一个选项,但 IIS Express 现在是推荐的服务器。 在 Visual Studio 11 Beta 中使用 IIS Express 的体验与在 Visual Studio 2010 SP1 中使用 IIS Express 非常类似。

免责声明

这是一份初稿,并可能在本文所述软件最终商业发布之前进行大幅更改。

本文档中包含的信息代表 Microsoft Corporation 在发布之日对所讨论问题的当前观点。 由于 Microsoft 必须响应不断变化的市场条件,因此不应将其解释为 Microsoft 作出的承诺,并且 Microsoft 无法保证在发布日期之后提供的任何信息的准确性。

本白皮书仅用于提供信息。 MICROSOFT 对本文档中的信息不做任何明示、暗示或法定的担保。

用户有责任遵守所有适用的版权法。 在不限制版权法规定的权利的情况下,未经 Microsoft Corporation 明确书面允许,不得出于任何目的,以任何形式或通过任何方式(电子、机械、影印、录制或其他方式)对本文档中的任何内容进行复制、传输或者将其存储到或引入到检索系统。

Microsoft 可能拥有涉及本文档中的主题的专利、专利申请、商标、版权和其他知识产权。 除非得到 Microsoft 的明确书面许可,否则本文档不授予用户任何使用这些专利、商标、版权或其他知识产权的许可。

除非另有说明,否则示例公司、组织、产品、域名、电子邮件地址、徽标、人员、地点和事件都是虚构的,并且不会与任何真实公司、组织、产品、域名、电子邮件地址、徽标、人员、地点或事件关联或应推断。

© 2012 Microsoft Corporation. 保留所有权利。

Microsoft 和 Windows 是 Microsoft Corporation 在美国和/或其他国家/地区的注册商标或商标。

此处提到的真实公司和产品的名称可能是其各自所有者的商标。