当前位置: 移动技术网 > IT编程>开发语言>.net > 解读ASP.NET 5 & MVC6系列教程(15):MvcOptions配置

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

百乐门香烟,寒亭一中校歌,焚天仙境

程序模型处理 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,则不忽略。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网