解读ASP.NET 5 & MVC6系列(15):MvcOptions配置
程序模型处理 IApplicationModelConvention
在MvcOptions
的实例对象上,有一个ApplicationModelConventions
属性(类型是:List<IApplicationModelConvention>
),该属性IApplicationModelConvention
类型的接口集合,用于处理应用模型ApplicationModel
,该集合是在MVC程序启动的时候进行调用,所以在调用之前,我们可以对其进行修改或更新,比如,我们可以针对所有的Controller和Action在数据库中进行授权定义,在程序启动的时候读取数据授权信息,然后对应用模型ApplicationModel
进行处理。 示例如下:
public class PermissionCheckApplicationModelConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controllerModel in application.Controllers)
{
var controllerType = controllerModel.ControllerType;
var controllerName = controllerModel.ControllerName;
controllerModel.Actions.ToList().ForEach(actionModel =>
{
var actionName = actionModel.ActionName;
var parameters = actionModel.Parameters;
// 根据判断条件,操作修改actionModel
});
// 根据判断条件,操作修改ControllerModel
}
}
}
视图引擎的管理ViewEngines
在MvcOptions的实例对象中,有一个ViewEngines属性用于保存系统的视图引擎集合,以便可以让我们实现自己的自定义视图引擎,比如在《自定义View视图文件查找逻辑》章节中,我们就利用了该特性,来实现了自己的自定义视图引擎,示例如下:
services.AddMvc().Configure<MvcOptions>(options =>
{
options.ViewEngines.Clear();
options.ViewEngines.Add(typeof(ThemeViewEngine));
});
Web API中的输入(InputFormater)/输出(OutputFormater)
输入
Web API和目前的MVC的输入参数的处理,目前支持JSON和XML格式,具体的处理类分别如下:
JsonInputFormatter
XmlDataContractSerializerInputFormatter
输出
在Web API中,默认的输出格式化器有如下四种:
HttpNoContentOutputFormatter
StringOutputFormatter
JsonOutputFormatter
XmlDataContractSerializerOutputFormatter
上述四种在系统中,是根据不同的情形自动进行判断输出的,具体判断规则如下:
如果是如下类似的Action,则使用HttpNoContentOutputFormatter
返回204,即NoContent。
public Task DoSomethingAsync()
{
// 返回Task
}
public void DoSomething()
{
// Void方法
}
public string GetString()
{
return null; // 返回null
}
public List<Data> GetData()
{
return null; // 返回null
}
如果是如下方法,同样是返回字符串,只有返回类型是string
的Action,才使用StringOutputFormatter
返回字符串;返回类型是object的Action,则使用JsonOutputFormatter
返回JSON类型的字符串数据。
public object GetData()
{
return"The Data"; // 返回JSON
}
public string GetString()
{
return"The Data"; // 返回字符串
}
如果上述两种类型的Action都不是,则默认使用JsonOutputFormatter
返回JSON数据,如果JsonOutputFormatter
格式化器通过如下语句被删除了,那就会使用XmlDataContractSerializerOutputFormatter
返回XML数据。
services.Configure<MvcOptions>(options =>
options.OutputFormatters.RemoveAll(formatter => formatter.Instance is JsonOutputFormatter)
);
当然,你也可以使用ProducesAttribute
显示声明使用JsonOutputFormatter
格式化器,示例如下。
public class Product2Controller : Controller
{
[Produces("application/json")]
//[Produces("application/xml")]
public Product Detail(int id)
{
return new Product() { ProductId = id, ProductName = "商品名称" };
}
}
或者,可以在基类Controller上,也可以使用ProducesAttribute
,示例如下:
[Produces("application/json")]
public class JsonController : Controller { }
public class HomeController : JsonController
{
public List<Data> GetMeData()
{
return GetDataFromSource();
}
}
当然,也可以在全局范围内声明该ProducesAttribute
,示例如下:
services.Configure<MvcOptions>(options =>
options.Filters.Add(newProducesAttribute("application/json"))
);
Output Cache 与 Profile
在MVC6中,OutputCache的特性由ResponseCacheAttribute
类来支持,示例如下:
[ResponseCache(Duration = 100)]
public IActionResult Index()
{
return Content(DateTime.Now.ToString());
}
上述示例表示,将该页面的内容在客户端缓存100秒,换句话说,就是在Response响应头header里添加一个Cache-Control
头,并设置max-age=100
。 该特性支持的属性列表如下:
属性名称 | 描述 |
---|---|
Duration | 缓存时间,单位:秒,示例:Cache-Control:max-age=100 |
NoStore | true则设置Cache-Control:no-store |
VaryByHeader | 设置Vary header头 |
Location | 缓存位置,如将Cache-Control设置为public, private或no-cache。 |
另外,ResponseCacheAttribute
还支持一个CacheProfileNam
e属性,以便可以读取全局设置的profile信息配置,进行缓存,示例如下:
[ResponseCache(CacheProfileName = "MyProfile")]
public IActionResult Index()
{
return Content(DateTime.Now.ToString());
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MvcOptions>(options =>
{
options.CacheProfiles.Add("MyProfile",
new CacheProfile
{
Duration = 100
});
});
}
通过向MvcOptions
的CacheProfiles
属性值添加一个名为MyProfile
的个性设置,可以在所有的Action上都使用该配置信息。
其它我们已经很熟悉的内容
以下内容我们可能都已经非常熟悉了,因为在之前的MVC版本中都已经使用过了,这些内容均作为MvcOptions的属性而存在,具体功能列表如下(就不一一叙述了):
- Filters
- ModelBinders
- ModelValidatorProviders
- ValidationExcludeFilters
- ValueProviderFactories
另外两个:
MaxModelValidationErrors
置模型验证是显示的最大错误数量。
RespectBrowserAcceptHeader
在使用Web API的内容协定功能时,是否遵守Accept Header的定义,默认情况下当media type默认是*/*
的时候是忽略Accept header的。如果设置为true,则不忽略。
同步与推荐
本文已同步至目录索引:解读ASP.NET 5 & MVC6系列
解读ASP.NET 5 & MVC6系列(15):MvcOptions配置的更多相关文章
- 解读ASP.NET 5 & MVC6系列
本系列的大部分内容来自于微软源码的阅读和网络,大部分测试代码都是基于VS RC版本进行测试的. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 ...
- 解读ASP.NET 5 & MVC6 ---- 系列文章
本系列的大部分内容来自于微软源码的阅读和网络,大部分测试代码都是基于VS RC版本进行测试的. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 ...
- 解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑
之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写,所有的视图引擎都继承于该IVi ...
- 解读ASP.NET 5 & MVC6系列(12):基于Lamda表达式的强类型Routing实现
前面的深入理解Routing章节,我们讲到了在MVC中,除了使用默认的ASP.NET 5的路由注册方式,还可以使用基于Attribute的特性(Route和HttpXXX系列方法)来定义.本章,我们将 ...
- 解读ASP.NET 5 & MVC6系列(11):Routing路由
新版Routing功能介绍 在ASP.NET 5和MVC6中,Routing功能被全部重写了,虽然用法有些类似,但和之前的Routing原理完全不太一样了,该Routing框架不仅可以支持MVC和We ...
- [转帖]2016年的文章: 解读ASP.NET 5 & MVC6系列教程(1):ASP.NET 5简介
解读ASP.NET 5 & MVC6系列教程(1):ASP.NET 5简介 更新时间:2016年06月23日 11:38:00 作者:汤姆大叔 我要评论 https://www.jb ...
- 解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性
(GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文件和_ViewStart.cshtml平级,该文件的功能类 ...
- 解读ASP.NET 5 & MVC6系列(14):View Component
在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能.但在MVC6中,这一功能得到了 ...
- 解读ASP.NET 5 & MVC6系列(13):TagHelper
在新版的MVC6中,微软提供了强大的TagHelper功能,以便让我们摆脱如下的臃肿代码: @Html.LabelFor(model => model.FullName) @Html.EditF ...
随机推荐
- DotNet 资源大全中文版(Awesome最新版)
Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. 算法与数据结构 ...
- JavaScript 函数节流和函数去抖应用场景辨析
概述 也是好久没更新 源码解读,看着房价蹭蹭暴涨,心里也是五味杂陈,对未来充满恐惧和迷茫 ...(敢问一句你们上岸了吗) 言归正传,今天要介绍的是 underscore 中两个重要的方法,函数节流和函 ...
- 嵌入式开发中常见3个的C语言技巧
Hey,大家好!我是CrazyCatJack.今天我来说几个在嵌入式开发中常用的C语言技巧吧.也许你曾经用过,也许你只是见到过但是没有深入理解.那么今天好好补充下吧^_^ 1.指向函数的指针 指针不光 ...
- ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作
原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...
- MacOS平台下@rpath在动态链接库中的应用
一.背景介绍 公司开发的一个底层库被用在了Mac平台的多个产品中.在开发这个底层库的初期,对于Mac OSX下的Install name 并没有过多的了解.对于XCode中的install name项 ...
- 导出数据到Excel --使用ExcelReport有感
先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...
- 在DevExpress程序中使用内置的图标构建美观的界面元素
在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...
- CLR和.Net对象生存周期
标签:GC .Net C# CLR 前言 1. 基础概念明晰 * 1.1 公告语言运行时 * 1.2 托管模块 * 1.3 对象和类型 * 1.4 垃圾回收器 2. 垃圾回收模型 * 2.1 为什么需 ...
- 使用PD(PowerDesigner)图如何快速生成创建数据库表的SQL脚本
打开PD软件: 1.新建概念模型(conceptual Data Model) File-->New Model-->Conceptual Data Mode 或者点击工作区,右键--&g ...
- SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等
在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...