【问题标题】:Difference between ASP.NET MVC 3 and 4? [closed]ASP.NET MVC 3 和 4 之间的区别? [关闭]
【发布时间】:2012-09-21 17:30:05
【问题描述】:

是否有一个完整的列表来解释 MVC4 的所有新功能以及与 MVC3 相比发生了哪些变化?

release notes 帮助不大)

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

MVC4 Release Notes复制粘贴:

现代 HTTP 编程模型:使用新的强类型 HTTP 对象模型直接访问和操作 Web API 中的 HTTP 请求和响应。通过新的 HttpClient 类型可以在客户端对称地使用相同的编程模型和 HTTP 管道。

完全支持路由:ASP.NET Web API 支持 ASP.NET Routing 的全套路由功能,包括路由参数和约束。此外,使用简单的约定将操作映射到 HTTP 方法。

内容协商:客户端和服务器可以共同确定从 Web API 返回的数据的正确格式。 ASP.NET Web API 为 XML、JSON 和表单 URL 编码格式提供默认支持,您可以通过添加自己的格式化程序来扩展此支持,甚至替换默认的内容协商策略。

模型绑定和验证:模型绑定器提供了一种从 HTTP 请求的各个部分提取数据并将这些消息部分转换为 Web API 操作可以使用的 .NET 对象的简单方法.还根据数据注释对动作参数进行验证。

过滤器:ASP.NET Web API 支持过滤器,包括众所周知的过滤器,例如[Authorize] 属性。您可以编写和插入自己的过滤器,用于操作、授权和异常处理。

查询组合:对返回 IQueryable 的操作使用 [Queryable] 过滤器属性,以支持通过 OData 查询约定查询您的 Web API。

改进的可测试性:Web API 操作不是在静态上下文对象中设置 HTTP 详细信息,而是使用 HttpRequestMessage 和 HttpResponseMessage 的实例。与您的 Web API 项目一起创建一个单元测试项目,以便快速开始为您的 Web API 功能编写单元测试。

基于代码的配置:ASP.NET Web API 配置仅通过代码完成,使您的配置文件保持干净。使用提供服务定位器模式来配置扩展点。

改进了对控制反转 (IoC) 容器的支持:ASP.NET Web API 通过改进的依赖解析器抽象为 IoC 容器提供了强大的支持

自托管:除了 IIS,Web API 还可以托管在您自己的进程中,同时仍能充分利用路由和 Web API 的其他功能。

创建自定义帮助和测试页面:您现在可以使用新的 IApiExplorer 服务轻松为您的 Web API 构建自定义帮助和测试页面,以获得您的 Web API 的完整运行时描述。

监控和诊断:ASP.NET Web API 现在提供轻量级跟踪基础架构,可以轻松与现有的日志记录解决方案(例如 System.Diagnostics、ETW 和第三方日志记录框架)集成。您可以通过提供 ITraceWriter 实现并将其添加到您的 Web API 配置来启用跟踪。

链接生成:使用 ASP.NET Web API UrlHelper 生成指向同一应用程序中相关资源的链接。

Web API 项目模板:从新建 MVC 4 项目向导中选择新的 Web API 项目以快速启动并运行 ASP.NET Web API。

支架:使用“添加控制器”对话框快速构建基于实体框架模型类型的 Web API 控制器。

【讨论】:

  • 但这几乎都是关于 web api 的......如果我不打算使用 web api,有什么新东西要学习吗?
  • mvc3 和 mvc4 都是 Web 开发框架。您是说 .Net 4.5 吗?
  • @JSKNS Web API 是一个构建在 ASP.NET MVC 之上的框架,用于构建 RESTful API。他的意思是,您的发行说明中的​​大部分内容都是特定于 Web API 的,而不是通用于所有 ASP.NET MVC。
【解决方案2】:

Whats new in MVC4 - MVC3 Vs MVC4复制粘贴

MVC4 中的新功能 - MVC3 与 MVC4

默认项目模板的增强

用于创建新 ASP.NET MVC 4 项目的模板已更新,以创建更具现代感的网站

移动项目模板

如果您正在开始一个新项目并希望创建一个专门用于移动设备和平板电脑浏览器的网站,您可以使用新的移动应用程序项目模板。这是基于 jQuery Mobile,一个用于构建触摸优化 UI 的开源库

显示模式

新的显示模式功能允许应用程序根据发出请求的浏览器选择视图。例如,如果桌面浏览器请求主页,应用程序可能会使用Views\Home\Index.cshtml 模板。如果移动浏览器请求主页,应用程序可能会返回 Views\Home\Index.mobile.cshtml 模板。

DisplayModes.Modes.Insert(0, new DefaultDisplayMode("iPhone")
{
  ContextCondition = (context => context.Request.UserAgent.IndexOf
    ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
});

jQuery Mobile、视图切换器和浏览器覆盖

jQuery Mobile 是一个开源库,用于构建触摸优化的 Web UI。如果您想将 jQuery Mobile 与 ASP.NET MVC 4 应用程序一起使用,您可以下载并安装一个帮助您入门的 NuGet 包。要从 Visual Studio 包管理器控制台安装它,请键入以下命令: 安装包 jQuery.Mobile.MVC 这将安装 jQuery Mobile 和一些帮助文件,包括以下内容: Views/Shared/Layout.Mobile.cshtml,这是一个基于 jQuery Mobile 的布局。 一个视图切换器组件,它由 Views/Shared/ViewSwitcher.cshtml 部分视图和 ViewSwitcherController.cs 控制器组成。 安装包后,使用移动浏览器(或同等产品,如 Firefox 用户代理切换器插件)运行应用程序。您会看到您的页面看起来完全不同,因为 jQuery Mobile 处理布局和样式。要利用这一点,您可以执行以下操作 如果访问者单击该链接,他们将切换到同一页面的桌面版本。 由于默认情况下您的桌面布局不会包含视图切换器,因此访问者将无法进入移动模式。要启用此功能,请将以下引用添加到 _ViewSwitcher 到你的桌面布局,就在元素里面:

@Html.Partial("_ViewSwitcher")

... 浏览器覆盖是 ASP.NET MVC 4 的核心功能,即使您不安装 jQuery.Mobile.MVC 包也可用。但是,它只影响视图、布局和部分视图选择——它不会影响任何其他依赖于 Request.Browser 对象的 ASP.NET 功能。

Visual Studio 中的代码生成秘诀

新的“配方”功能使 Visual Studio 能够根据您可以使用 NuGet 安装的包生成解决方案特定的代码。 Recipes 框架使开发人员可以轻松编写代码生成插件,您还可以使用这些插件来替换 Add Area、Add Controller 和 Add View 的内置代码生成器。由于配方部署为 NuGet 包,因此可以轻松地将它们检入源代码管理并自动与项目中的所有开发人员共享。它们也可按解决方案提供。

异步控制器的任务支持

您现在可以将异步操作方法编写为返回 Task 或 Task 类型对象的单个方法。

例如,如果您使用 Visual C# 5(或使用 Async CTP),则可以创建如下所示的异步操作方法:

public async Task Index(string city) {
    var newsService = new NewsService();
    var sportsService = new SportsService();

    return View("Common", new PortalViewModel {
      NewsHeadlines = await newsService.GetHeadlinesAsync(),
      SportsScores = await sportsService.GetScoresAsync()
    });
}

在前面的 action 方法中,newsService.GetHeadlinesAsync 和 sportsService.GetScoresAsync 的调用是异步调用的,不会阻塞线程池中的线程。

返回 Task 实例的异步操作方法也可以支持超时。要使您的操作方法可取消,请将 CancellationToken 类型的参数添加到操作方法签名中。以下示例显示了一个异步操作方法,该方法的超时时间为 2500 毫秒,如果发生超时,它将向客户端显示 TimedOut 视图。

[AsyncTimeout(2500)]
[HandleError(ExceptionType = typeof(TaskCanceledException), View = "TimedOut")]
public async Task Index(string city, CancellationToken cancellationToken) {
    var newsService = new NewsService();
    var sportsService = new SportsService();

    return View("Common", new PortalViewModel {
      NewsHeadlines = await newsService.GetHeadlinesAsync(cancellationToken),
      SportsScores = await sportsService.GetScoresAsync(cancellationToken)
    });
}

希望这会有所帮助。谢谢

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      MVC 3

      1. 可通过 NuGet 扩展的集成脚手架系统
      2. 支持 HTML 5 的项目模板
      3. 富有表现力的视图,包括新的 Razor 视图 引擎
      4. 强大的依赖注入钩子和 全局操作过滤器
      5. 通过不显眼的 JavaScript、jQuery 验证和 JSON 绑定支持丰富的 JavaScript

      MVC 4

      1. ASP.NET Web API
      2. 刷新和现代化的默认项目 模板
      3. 新的移动项目模板
      4. 支持移动应用的许多新功能
      5. 增强了对异步方法的支持

      参考:http://dotnet-developers-cafe.blogspot.in/2013/09/difference-between-aspnet-mvc-3-and-mvc.html

      【讨论】:

        【解决方案5】:
        【解决方案6】:

        MVC 4.0 中引入的一个重要特性是异步控制器,它可以编写异步操作方法。异步控制器允许在不使工作线程空闲的情况下执行操作。

        当调用异步操作时,会发生以下步骤:

        Web 服务器从线程池(工作线程)中获取一个线程并调度它来处理传入的请求。此工作线程启动异步操作。 工作线程返回到线程池以服务另一个 Web 请求。 当异步操作完成时,它会通知 ASP.NET。 Web 服务器从线程池(可能与启动异步操作的线程不同的线程)中获取一个工作线程来处理请求的其余部分,包括呈现响应。

        将同步操作方法转换为异步操作方法

        以下是同步动作方法及其异步等效版本的示例。

        同步控制器:

         public class TestController : Controller
         {
           public ActionResult Index()
            {
             return View(); 
            }
         }
        

        上述操作的异步变体:

        public class TestController : AsyncController
        {
           public void IndexAsync()
           {
            return View();
           }
        
          public ActionResult IndexCompleted()
          {
           return View();
          }
        }
        

        步骤:

        • 同步控制器是从控制器派生的类 类来实现 AsyncController 而不是派生 控制器来自 Controller,从 AsyncController 类派生它。 从 AsyncController 派生的控制器使 ASP.NET 能够 处理异步请求,它们仍然可以服务同步 行动方法。

        • 对应Synchronous中的同步动作方法 控制器,您需要为其中的操作创建两个方法 异步控制器。启动异步的第一个方法 进程的名称必须由操作和后缀组成 “异步”。异步时调用的另一个方法 进程完成(回调方法)的名称必须包含 动作和后缀“已完成”。

          在上面的示例中,Index 动作已经变成 异步控制器中的两种方法:IndexAsync 和 索引完成。

          IndexAsync 方法返回 void 而 IndexCompleted 方法 返回一个 ActionResult 实例。虽然动作包括两个 方法,它使用与同步的相同 URL 访问 操作方法(例如,Controller/Index)。

        关于异步操作方法,请注意以下几点:

        如果操作名称为 Sample,则框架将查找 SampleAsync 和 SampleCompleted 方法。

        视图页面应命名为 Sample.aspx,而不是 SampleAsync.aspx 或 SampleCompleted.aspx。 (动作名称是 Sample,而不是 SampleAsync)

        控制器不能包含名为 SampleAsync 的异步方法和名为 Sample 的同步方法。如果是这样,则会引发 AmbiguousMatchException 异常,因为 SampleAsync 操作方法和 Sample 操作方法具有相同的请求签名。

        更多详情请点击:http://www.counsellingbyabhi.com/2014/05/asynchronous-controllers-in-aspnet-mvc.html

        【讨论】:

        • 其他回复中提到了异步控制器(从 2 年前开始)
        • 但是这里没有提到异步控制器,这是在MVC 4中引入的。这就是我在这里提到的原因。
        猜你喜欢
        • 2011-10-04
        • 2017-03-07
        • 2012-11-24
        • 2011-06-15
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        相关资源
        最近更新 更多