ASP.NET MVC 3和4之间的区别是什么?

62

有没有一份全面的列表,解释了所有MVC4的新功能以及与MVC3相比发生了哪些变化?

发布说明并不是很有帮助)


2
请查看发布说明:http://www.asp.net/whitepapers/mvc4-release-notes#_Toc303253808 - D Stanley
14
释出说明并不是很有帮助。请查看释出说明。 - B. Clay Shannon-B. Crow Raven
6个回答

61

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 容器支持。

自托管:除了使用完整功能的路由和其他 Web API 功能外,Web API 还可以在您自己的进程中托管。

创建自定义帮助和测试页面:现在您可以使用新的 IApiExplorer 服务,获取您的 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。

脚手架:使用“添加控制器”对话框,根据基于 Entity Framework 的模型类型,快速构建 Web API 控制器。


6
如果我不打算使用 Web API,除了 Web API 的知识之外还有什么新东西需要学习吗? - Akshat Jiwan Sharma
mvc3和mvc4都是Web开发框架。你的意思是.Net 4.5吗? - JSK NS
2
@JSKNS Web API是基于ASP.NET MVC构建的框架,用于构建RESTful API。它的意思是,你发行说明中的大部分内容都是Web API特有的,而不是所有ASP.NET MVC通用的。 - Ant P

41

MVC4中的新功能-MVC3与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的开源库。如果你想在ASP.NET MVC 4应用程序中使用jQuery Mobile,可以下载并安装一个NuGet包来帮助你入门。要从Visual Studio Package Manager控制台安装它,请键入以下命令:Install-Package 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中的代码生成配方使得根据NuGet安装的软件包生成特定于解决方案的代码成为可能。配方框架使得开发人员编写代码生成插件变得容易,您还可以使用这些插件来替换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()
    });
}

在先前的操作方法中,对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)
    });
}

希望这可以帮到你。谢谢。


1

MVC 3

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

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


0

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();
  }
}

步骤:

  • 同步控制器(Synchronous Controllers)是从Controller类派生的类,用于实现AsyncController,而不是从Controller派生控制器。派生自AsyncController的控制器使ASP.NET能够处理异步请求,并且它们仍然可以服务于同步操作方法。

  • 对应于同步控制器中的同步操作方法,您需要为asynchronous controller中的操作创建两个方法。启动异步进程的第一个方法必须有一个由操作和后缀“Async”组成的名称。当异步进程完成时调用的另一个方法(回调方法)必须具有由操作和后缀“Completed”组成的名称。

    在上述示例中,Index操作已经变成了asynchronous controller中的两个方法:IndexAsync和 IndexCompleted。

    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年前)。 - Display Name
1
但是这里没有提到在MVC 4中引入的异步控制器,所以我在这里提到了它。 - Abhishek Gahlout


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接