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

Aks*_*rma 63 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

是否有一个全面的列表解释了MVC4的所有新功能以及MVC3的所有变化?

(发行说明没有太大帮助)

JSK*_* NS 61

MVC4发行说明中复制并粘贴:

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

完全支持路由:ASP.NET Web API支持ASP.NET路由的全套路由功能,包括路由参数和约束.此外,使用简单约定将操作映射到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项目模板:从New MVC 4 Project向导中选择新的Web API项目,以快速启动并运行ASP.NET Web API.

脚手架:使用"添加控制器"对话框可基于基于实体框架的模型类型快速构建Web API控制器.

  • 但这几乎都是关于web api ....如果我不打算使用web api,还有什么新的东西要学习吗? (6认同)
  • @JSKNS Web API是一个构建在ASP.NET MVC之上的框架,用于构建RESTful API.他的意思是你的发行说明中的​​大部分内容都是特定于Web API的,而不是对所有ASP.NET MVC都是通用的. (2认同)

Dis*_*ame 42

复制并粘贴来自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)
});
Run Code Online (Sandbox Code Playgroud)

jQuery Mobile,View Switcher和Browser Overriding

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

@Html.Partial("_ViewSwitcher")
Run Code Online (Sandbox Code Playgroud)

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

Visual Studio中代码生成的配方

新的Recipes功能使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()
    });
}
Run Code Online (Sandbox Code Playgroud)

在上一个操作方法中,对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)
    });
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.谢谢