欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解读ASP.NET 5 & MVC6系列教程(15):MvcOptions配置

程序员文章站 2023-12-03 08:49:34
程序模型处理 iapplicationmodelconvention 在mvcoptions的实例对象上,有一个applicationmodelconventions属性...

程序模型处理 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还支持一个cacheprofilename属性,以便可以读取全局设置的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
   });
 });
}

通过向mvcoptionscacheprofiles属性值添加一个名为myprofile的个性设置,可以在所有的action上都使用该配置信息。

其它我们已经很熟悉的内容

以下内容我们可能都已经非常熟悉了,因为在之前的mvc版本中都已经使用过了,这些内容均作为mvcoptions的属性而存在,具体功能列表如下(就不一一叙述了):

filtersmodelbindersmodelvalidatorprovidersvalidationexcludefiltersvalueproviderfactories

另外两个:
maxmodelvalidationerrors
置模型验证是显示的最大错误数量。

respectbrowseracceptheader
在使用web api的内容协定功能时,是否遵守accept header的定义,默认情况下当media type默认是*/*的时候是忽略accept header的。如果设置为true,则不忽略。