asp.net-mvc – ASP.NET MVC查看引擎解析顺序

我创建了一个简单的ASP.NET MVC 1.0版应用程序.我有一个ProductController有一个动作索引.在该视图中,我在“产品”子文件夹下创建了一个相应的Index.aspx.

然后我引用了Spark dll并在同一个Product视图文件夹下创建了Index.spark. Application_Start看起来像

protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);

        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new Spark.Web.Mvc.SparkViewFactory());

        ViewEngines.Engines.Add(new WebFormViewEngine());

    }

我的期望是,由于Spark引擎在默认WebFormViewEngine之前注册,当在Product控制器中浏览Index操作时,应该使用Spark引擎,并且WebFormViewEngine应该用于所有其他URL.

但是,测试表明,产品控制器的索引操作也使用WebFormViewEngine.

如果我注释了WebFormViewEnginer(代码中的最后一行)的注册,我可以看到,索引操作是由Spark引擎呈现的,其余的URL会产生错误(因为defualt引擎已经不见了),这证明我所有的火花码是正确的.

现在我的问题是视图引擎如何解决?为什么注册顺序不生效?

解决方法

注册视图引擎的顺序并不重要(很多).相反,视图引擎采用一组ViewLocationFormats,并且如果特定视图路径适合格式化的名称,那么该引擎将被使用.只有当您有冲突格式时,注册顺序很重要.

在火花的情况下,视图应该具有.spark扩展名. WebFormViewEngine将响应.aspx或.ascx扩展名.当然,如上所述,您可以通过更改提供给各个视图引擎的ViewLocationFormat来覆盖任何一个.

更新:

我浏览了SparkViewFactory和WebFormViewEngine(或更具体地说,后者源自的VirtualPathProviderViewEngine)的源码,我可以告诉你为什么你看到这个奇怪的行为.

首先,ViewEngineCollection类中的Find方法类似于此(简化):

foreach (IViewEngine engine in Items) {
    // Query engine for cached view
}

foreach (IViewEngine engine in Items) {
    // Query engine for uncached view
}

换句话说,它将始终尝试在任何引擎中查找缓存的视图,然后再使用未缓存的模式.

单个视图引擎实现这一点的方式是FindView方法的第二个重载,该方法使用一个名为useCache的bool参数.

然而,这里的所有东西都变得奇怪 – VirtualPathProviderViewEngine和SparkViewEngine对useCache参数的含义有非常不同的想法.这里有太多的代码来重新发布,但基本思路是:

>如果useCache为true,则SparkViewFactory将仅在缓存中查找.如果没有找到任何东西,它会自动返回“高速缓存未命中结果” – 即没有.另一方面,如果useCache为false,则不会在缓存中查找,它将跳过缓存检查步骤,并通过正常运动来解析并创建实际视图.
>另一方面,如果useCache为true,则VirtualPathProviderViewEngine会在缓存中查找,如果在缓存中没有找到该视图,则它会关闭并创建一个新的视图,并将其添加到缓存.

这两种方法都适用于ViewEngineCollection执行搜索的方式.

>在火花的情况下,它在视图引擎的第一次迭代中“错过”,而第二次“点击”,之后将该视图添加到缓存中.没问题.
>在VirtualPathProviderViewEngine的情况下,它在内部“错过”,但是在第一次迭代时返回“命中”,此时视图将被缓存.

所以你应该可以看到问题出在哪里. VirtualPathProviderViewEngine似乎优先于SparkViewEngine,因为前者总是成功执行第一次(缓存)迭代,但Spark仅在第二次(未缓存)迭代中成功.

在简单的英文中,Spark确实会先问出问题,但是回复:“不,我还没有这个看法,而不用缓存吧. WebForms被问到第二个,但自动说“我没有这个看法,但我去了,为你做了一个,这里是”.从那时起,WebFormViewEngine总是获得优先级,因为它具有缓存的视图,而Spark没有.

总结:Spark正在优先考虑,但是由于Spark对待useCache参数的方式有点奇怪,当Web Form引擎同时处于活动状态时,它会被灰尘遮住.任何一个WebForm都是过分的,或者Spark是懒惰的,这取决于你的观点.

简单地说,解决方案是没有冲突的观点!如果您已经注册了多个视图引擎,那么您应该将任何视图名称视为未定义的行为.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个Nginx-Powered AspNet Core Web准生产应用。 在开始之前,我们还是重温一下部署原理,正如你所常见的.Net Core 部署图: 在Linux上部署.Net Core App最好的方式是在Linux机器
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式。 相信很多开发者都看到如下异步编程实践原则: 遵守以上冷冰冰的②③条的原则,可保证异步程序按照预期状态正常运作;我们在各大编程论坛常看到违背
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道pipeline中用于处理请求和操作响应的组件。 每个组件是pipeline 中的一环。 自行决定是否将请求传递给下一个组件 在处理管道的下个组件执行之前和之后执行业务逻辑 二. 特性和行为 ASP.NET Core处
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要取消正在进行的异步操作,通过本文,可以掌握 通过CancellationToken取消任务(包括non-cancellable任务)。 Task 表示无返回值的异步操作, 泛型版本Task<TResult>表示有返
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authentication)是一种允许网页浏览器或其他客户端程序以(用户名:口令) 请求资源的身份验证方式,不要求cookie,session identifier、login page等标记或载体。 - 所有浏览器据支持HTTP基本认
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续两次OrderBy,后面一个有可能会打乱前面一个的排序顺序,可能与预期不符。 要实现sql中的order by word,name类似效果; LINQ 有ThenBy可以紧接使用, ThenBy记住原本排序的值,然后再排其他值,
ASP.NET Core 核心特性:开源、跨平台、高性能是其决战JAVA的必胜法宝,最引人关注的跨平台特性 到底是怎么实现? 
 本文分Unix、Windows剖析跨平台内幕,读完让你大呼过瘾。
前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现。 IAsyncResult BeginGetResponse(AsyncCallback callback, object state
引言 最近在公司开发了一个项目,项目部署架构图如下: 思路 如图中文本所述,公司大数据集群不允许直接访问外网,需要一个网关服务器代理请求,本处服务器A就是边缘代理服务器的作用。 通常技术人员最快捷的思路是在服务器A上部署IISʺpplication Request Routing Module组件
作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本。 但是很多时候,若使用的是共享主机或者受控主机,这些主机不允许你私自安装exe程序、Windows服务程序
引言 熟悉TPL Dataflow博文的朋友可能记得这是个单体程序,使用TPL Dataflow 处理工作流任务, 在使用Docker部署的过程中, 有一个问题一直无法回避: 在单体程序部署的瞬间(服务不可用)会有少量流量无法处理;更糟糕的情况下,迭代部署的这个版本有问题,上线后无法运作, 更多的流
合格的web后端程序员,除搬砖技能,还必须会给各种web服务器配置Https,本文结合ASP.NET Core部署模型聊一聊启用Https的方式。 温故知新 目前常见的Http请求明文传输,请求可能被篡改,访问的站点可能被伪造。 HTTPS是HTTP加上TLS/SSL协议构建的可进行加密传输、身份认
长话短说 前文《解剖HttpClientFactory,自由扩展HttpMessageHandler》主要讲如何为HttpClientFactory自定义HttpMessageHandler组件, 现在来完成课后的小作业: 将重点日志字段显示到Nlog的LayoutRenderer上。 本文实现一个
引言问题 作为资深老鸟,有事没事,出去面试;找准差距、定位价值。 面试必谈哈希, Q1:什么是哈希? Q2:哈希为什么快? Q3:你是怎么理解哈希算法利用空间换取时间的? Q4:你是怎么解决哈希冲突的? Q5:你有实际用写过哈希算法吗? 知识储备 哈希(也叫散列)是一种查找算法(可用于插入),哈希算
前言 如题,有感于博客园最近多次翻车,感觉像胡子眉毛一把抓, 定位不了生产环境的问题。 抛开流程问题,思考在生产环境中如何做故障排除, 发现博客园里面这方面的文章比较少。 .Net 本身是提供了sos.dll工具帮助我们在生产中故障排除,通过提供有关内部公共语言运行时(CLR)环境的信息,
.NET程序是基于.NET Framework、.NET Core、Mono、【.NET实现】开发和运行的 ,定义以上【.NET实现】的标准规范称为.NET Standard .NET Standard .NET标准是一组API集合,由上层三种【.NET实现】的Basic Class Library
长话短说 上个月公司上线了一个物联网数据科学项目,我主要负责前端接受物联网事件,并提供 参数下载。 webapp 部署在Azure云上,参数使用Azure SQL Server存储。 最近从灰度测试转向全量部署之后,日志时常收到: SQL Session超限报错。 排查 我在Azure上使用的是 S
临近年关,搜狗,360浏览器出现页面无法成功跳转,同域Cookie丢失? 也许是服务端 SameSite惹的祸。
本文揭示由于Chrome低版本内核不识别 SameSite= None, 引发的单点登录故障。
本文聊一聊TraceID的作用和一般组成,衍生出ASP. NETCore 单体和分布式程序中 TraceId 的使用方式
通过给 HttpClint请求的日志增加 TraceId,解锁自定义扩展 HttpClientFacroty 的姿势