MVC3 - 编译的 Razor 视图找不到 _ViewStart

2024-02-15

我在单独的类库中使用编译的 Razor 视图作为 MVC3 的一种插件系统。

我遵循 Chris Van De Steed 的指南here http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled-razor-views-in-your-dll/并且仅在添加引用的部分主要有所偏差,因为我在运行时加载程序集。

因为我在运行时加载程序集,所以我没有使用 BoC 库中的 VirtualPathProviderViewEngine,而是基于 RazorViewEngine 实现了我自己的 ViewEngine。它的工作原理是重写CreateView中的viewPath以插入适当的命名空间,以便可以解析视图。

到目前为止一切顺利...我可以加载不同的模块,并且如果它们共享相同的名称,它们的控制器就不会发生冲突。

我现在遇到的唯一问题是,对于编译视图,未调用 _ViewStart。 _ViewStart 适用于主机 MVC3 项目中的视图,但对于从插件程序集加载的任何视图,找不到它。

我有这样的路线设置:-

RouteTable.Routes.MapRoute(
    string.Format("Plugin{0}Route", pluginName),
    string.Format(@"Plugin/{0}/{{controller}}/{{action}}", pluginName),
    new { },
    new string[] { string.Format("{0}.Controllers", pluginName) });

ViewEngine 看起来像这样:-

public class PluginRazorViewEngine : RazorViewEngine
{
    public PluginRazorViewEngine() : base()
    {
        ViewLocationFormats = new[]
        {
            "~/Plugin/%1/Views/{1}/{0}.cshtml",
            "~/Plugin/%1/Views/{1}/{0}.vbhtml",
            "~/Plugin/%1/Views/Shared/{0}.cshtml",
            "~/Plugin/%1/Views/Shared/{0}.vbhtml",
            "~/Views/{1}/{0}.cshtml",
            "~/Views/{1}/{0}.vbhtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Shared/{0}.vbhtml"
        };

(%1 替换为程序集的名称)

并且该程序集已在 BoC 库中注册,如下所示:-

BoC.Web.Mvc.PrecompiledViews.ApplicationPartRegistry.Register(assembly, string.Format("/Plugin/{0}/", pluginName));

当从插件程序集(在本例中为“帐户”)加载视图时,会找到该视图并正常显示。但随后它会在这些位置查找 _ViewStart:-

~/plugin/accounts/views/invoice/_viewstart.cshtml
~/plugin/accounts/views/invoice/_viewstart.vbhtml
~/plugin/accounts/views/_viewstart.cshtml
~/plugin/accounts/views/_viewstart.vbhtml
~/plugin/accounts/_viewstart.cshtml
~/plugin/accounts/_viewstart.vbhtml
~/plugin/_viewstart.cshtml
~/plugin/_viewstart.vbhtml
~/_viewstart.cshtml
~/_viewstart.vbhtml

但它不会在文件所在的 ~/Views/Shared/_ViewStart.cshtml 中查找。

我尝试更改 ViewEngine 中的所有位置格式(AreaMasterLocationFormats、AreaPartialViewLocationFormats、AreaViewLocationFormats、MasterLocationFormats、PartialViewLocationFormats 和 ViewLocationFormats),但它们似乎都没有效果。

我环顾四周,似乎System.Web.WebPages.StartPage.获取起始页 http://msdn.microsoft.com/en-us/library/system.web.webpages.startpage.getstartpage%28v=vs.99%29.aspx负责在视图中查找并返回起始页,但我找不到任何有关如何控制其外观的信息。

我尝试将 _ViewStart.cshtml 移动到 ~/_ViewStart.cshtml (它看起来的地方之一),但我立即得到:-

Unable to cast object of type 'ASP._Page__ViewStart_cshtml' to type 'System.Web.WebPages.StartPage'.

根据我读到的内容,是因为 _ViewStart 需要位于 /Views 下

我可以修改 MVC 查找 _ViewStart 的位置吗?

BoC 库实现了它自己的 IView,并调用以下内容:-

startPage = this.StartPageLookup(page, VirtualPathFactoryManagerViewEngine.ViewStartFileName, this.ViewStartFileExtensions);

但在本例中,ViewStartFileName 只是“_ViewStart”,ViewStartFileExtensions 只是 cshtml 和 vbhtml...没有任何内容可以控制 MVC 应在何处搜索文件。


一个想法...(例如,还没有尝试过。它会起作用吗?不知道)

也许看看继承自RazorView(或者完全替换它,考虑到 - 正如我们将看到的 - 您将重写作为类大部分的一个方法)。

RazorView在哪StartPage.GetStartPage通过将其分配给一个来引入StartPageLookup财产:

// In RazorView constructor:
StartPageLookup = StartPage.GetStartPage;

不幸的是,该委托属性是内部的,因此您不能在派生类的构造函数中覆盖它。但是,您可以覆盖RazorView.RenderView,这就是它所在的地方used(MVC3源代码,删除了很多行,换行符是我添加的):

protected override void RenderView(ViewContext viewContext, TextWriter writer, 
   object instance) 
{
  // [SNIP]

  WebPageRenderingBase startPage = null;
  if (RunViewStartPages) {
     // HERE IT IS:
     startPage = StartPageLookup(
        webViewPage, 
        RazorViewEngine.ViewStartFileName, 
        ViewStartFileExtensions
     );
  }
  webViewPage.ExecutePageHierarchy(
     new WebPageContext(
        context: viewContext.HttpContext, 
        page: null, 
        model: null),
     writer, startPage);
}

将 StartPageLookup 调用替换为您自己的查找,然后替换结果CreateView and CreatePartialView在你的PluginRazorViewEngine与你的新PluginRazorView class.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC3 - 编译的 Razor 视图找不到 _ViewStart 的相关文章

  • mvc 4下拉默认值选择

    我想在下拉列表中选择默认值 其中policyId 7 但它没有选择该值 我做错了什么 控制器 var pm new ManagerClass IEnumerable
  • 加载依赖于另一个域的程序集时 FileNotFound [重复]

    这个问题在这里已经有答案了 我正在尝试使用插件制作应用程序 我有 MainLib dll 我在其中制作了一些通用接口 让它成为ICommon 用 1 种方法 然后 我制作了 2 个 dll 插件 它们引用了 MainLib dll 并实现了
  • 如何在MVC中获取控制器中的下拉值

    我使用递归函数使用字符串列表绑定下拉列表我的下拉菜单具有类似的值 家 首页 gt gt 厨房 首页 gt gt 厨房 gt gt ABC 我想在数据库中使用相同的下拉值 ABC 这是我的查看代码 ViewBag Title Createne
  • 只能加载NetBeans中的一些gradle项目

    非常类似于 无法在 NetBeans 中加载 gradle 项目 https stackoverflow com q 17698135 262852但我认为并不完全相同 即使只是因为这个问题的年龄 我看到了 gradle 消息after h
  • MVC ASP.NET 或 Razor

    我对 MVC 很陌生 我对 Silver light WPF 和 MVVM 有相当多的了解 但对 MVC 知之甚少 我正在按照 Microsoft 网站上的主要教程进行操作http www asp net mvc tutorials get
  • jQuery - 检测鼠标是否静止?

    我想知道是否有一种方法可以检测 jQuery 中鼠标是否空闲了 3 秒 是否有我不知道的插件 因为我不相信有一个原生的 jQuery 方法 任何帮助将非常感激 您可以收听mousemove事件 每当发生时启动超时并取消任何现有超时 var
  • 提交Ajax表单后如何用消息更新_Layout.cshtml中的DIV?

    目前我有一把剃须刀View像这样 TotalPaymentsByMonthYear cshtml model MyApp Web ViewModels MyViewModel using Ajax BeginForm TotalPaymen
  • ASP.NET MVC 防伪造令牌不安全

    在没有 ssl 的情况下向服务器发出请求时 我实际上可以看到 MVC3 框架以纯文本形式生成的验证令牌密钥 该密钥存储在名为 RequestVerificationToken Lw 的 cookie 中 在混合安全环境中 实际上可以在向非
  • EditorFor 的最小值和最大值

    我一直在尝试这段代码来设置我的最小值和最大值EditorFor
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • MVC 3 Razor _ViewStart 中的公共变量

    我正在 MVC 3 附带的新 Razor 引擎上构建一个网站 并且喜欢新语法 但是 我对使用公共属性 常量感到不知所措 我知道使用 WebForms 我们可以在代码后面添加公共属性 public string ImageFolder get
  • tomcat-maven-plugin 使用 Tomcat 7 - tomcat:deploy 有效,tomcat:undeploy 无效

    我有一个 tomcat deploy 的工作配置 但是当我取消部署 WAR 时 出现以下错误 这让我很困惑 INFO Scanning for projects WARNING WARNING Some problems were enco
  • MVC 3 不会提供 Areas 子文件夹中的内容文件

    我有一个 MVC3 应用程序 其中有几个区域和一个可移植区域 使用 MVCContrib 通常 我将所有内容文件保存在 Content 下 将脚本保存在 Scripts 下 然而 我正在为我的网站上的另一个服务构建一个相当复杂的网络客户端
  • ASP.NET MVC区域命名空间问题

    我在我的 asp net mvc 3 解决方案中创建一个名为的新区域admin Visual Studio 自动分配名称空间 MyApp areas admin controllers 我将其更改为MyApp admin controlle
  • 未找到键为“”的资源对象。自动部署的 ASP.NET MVC3 应用程序

    我有一个使用 LocalResources 本地化的 ASP NET MVC 3 应用程序 一切 一如既往 在我的机器上运行 但是当应用程序部署 通过 tfs 自动部署 到我的测试环境时 我收到以下错误 未找到键为 的资源对象 我的资源文件
  • 将 MVC2 升级到 MVC3 - 仅在服务器上出现问题 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我已使用此
  • 表格不会提交

    我的 jquery mobile modernizr 网站上有一个表单 我正在使用 jquery mobile 的 1 1 0 rc 1 我的页面上有此表单 但它没有提交 单击搜索按钮绝对不会执行任何操作 我不知道为什么 有任何想法吗 p
  • 如何创建浏览器插件?

    我必须创建一个插件 当用户将鼠标悬停在某些术语上时 该插件必须显示信息 谁能告诉我如何做的方向 我对创建插件没有太多想法 我知道我想要做的事情可以通过java脚本来完成 但是java脚本文件可以作为浏览器插件安装吗 任何对此的想法将不胜感激
  • 如何直接从 Razor View 调用 .NET CORE MVC 中的 POST 方法?

    我想从控制器调用我的方法 HttpPost public async Task
  • MVC 4 捆绑和缩小是否会进行缓存?

    我想使用 MVC4 的捆绑和模仿功能 但我担心模仿 是否每次客户端请求 css 和 javascript 时 捆绑 模拟过程都会起作用 如果是的话那不是每次都会有CPU开销吗 Quote http www asp net mvc tutor

随机推荐

  • idivl 和 divl 有什么区别?

    我有这些表达 cltd idivl ecx 当除以int and movl 0 edx divl ecx 当划分一个unsigned long cltd http docs oracle com cd E19455 01 806 3773
  • 如何使用 LINQ 和实体框架计算一行中所有列的校验和?

    我尝试执行的查询与此类似 var checksum from i in db Items where i Id id select SqlFunctions Checksum 但是 这会返回字符串的校验和值 而不是评估通配符 有没有办法计算
  • Proguard 错误:参数号 12 中的未知选项“(”

    我无法使用 proguard 导出我的项目 我收到此错误并且没有解决方案 我不知道第 12 号参数在哪里 2013 05 14 17 38 39 LiveWallpaper Proguard returned with error code
  • Redux Form、Radio Button Fields、如何支持变量值?

    在我的 React Redux 表单中 我有以下内容 fieldset legend Radio buttons legend this props job titles map jobTitle gt div div fieldset
  • HTTP 状态 500 - 未找到提供程序 org.glassfish.json.JsonProviderImpl

    我在用netbeans 8 jdk 7 tomcat 8 05 我创建了一个网络应用程序netbeans并添加了javax jsonapi 到我的项目 代码显示没有错误 但是当我运行我的 servlet 时 出现以下错误 HTTP Stat
  • webpack-dev-server 代理到 docker 容器

    我有 2 个使用 docker compose 管理的 docker 容器 似乎无法正确使用 webpack 来代理某些请求到后端 api docker compose yml version 2 services web build co
  • 如何与 python 的子进程作为连续会话进行交互

    我需要在 python 中实现一个过滤器 它从 Linux 命令行字典工具中挑选出特定的输出 我需要 从文件中获取一组单词 查找每个单词 1 如果单词不包含 则跳过它 2 else 如果是动词 则保存定义 为了测试代码 我写了两个pytho
  • 尝试运行 org.hibernate.tool.ant.EnversHibernateToolTask​​ 时遇到很多绊脚石

    我正在尝试按照建议运行 org hibernate tool ant EnversHibernateToolTask恩弗斯的相当简洁的指南 http www jboss org envers downloads 表的第二行 文档有 PDF
  • Macos Catalina 更新后出现错误:无法运行 colorls

    更新至 macOSCatalina打开终端时出错 ERROR Can t find Ruby library file or shared library colorls usage dirname path Users varunsukh
  • 仅使用公式即可获取当前文化以进行本地化

    有没有办法使用 Excel 中的公式确定当前系统区域性不使用任何VBA代码 我想象这样简单的事情 IF CULTURE sk SK Preh ad Overview 或者类似的事情也适合我 IF CURRENCYSIGN Preh ad O
  • 仅备份 SQL 架构?

    我需要创建 SQL Server 2005 数据库的备份 该数据库只有结构 没有记录 只有架构 有什么办法可以做到这一点吗 编辑 我正在尝试创建一个备份文件以与旧进程一起使用 因此脚本无法满足我的目的 抱歉 使用 3 步流程 从工作数据库生
  • 通过网站从 PHP 服务器下载文件 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有物理文件 希望用户在我的网站上下载 这些文件位于 C xampp htdocs myfile uploads 我需要一个 PHP 脚本
  • 撤消 git Push 到 Assembla

    所以 今天我想做一件好事并重新排列我的存储库中的文件 致力于并推动我的Assembla存储库 由于我没有使用 git moving 命令 所有文件都丢失了历史记录 我意识到自己的错误 并希望摆脱不必要的改变 以便之后可以采取正确的行动 我尝
  • 将 Java-Pair-Rdd 转换为 Rdd

    我需要将 Java pair rdd 转换为 csv 所以我想将其转换为rdd 来解决我的问题 我想要的是改变我的rdd 从 Key Value Jack a b c to Key value Jack a Jack b Jack c 我认
  • 如何在ElasticSearch中不进行分析?

    我不想分析 ElasticSearch 字段中的一个字段 即 e 应逐字保存和比较 这些值将包含字母 数字 空格 破折号 斜杠以及可能的其他字符 如果我没有在该字段的映射中提供分析器 则默认情况下仍使用分词器将我的逐字字符串分解为单词块 我
  • 在 Ruby 中删除“@”符号及其后面的所有内容

    我正在开发一个应用程序 我需要将用户电子邮件地址中 符号之前的任何内容作为他 她的名字和姓氏传递 例如 如果用户有电子邮件地址 电子邮件受保护 cdn cgi l email protection 比当用户提交表单时我从电子邮件中删除 ex
  • Typescript - 导入 Express 不起作用

    我的应用程序中有这个 types express已安装依赖项 import express require express 它指向的是express并说this is an unexpected identifier当我运行我的服务器时 我
  • Memcached 守护进程是否可以在不终止进程的情况下释放未使用的内存?

    我相信您不能强制正在运行的 Memcached 实例取消分配内存 除非终止该 Memcached 实例 并释放它所持有的所有内存 有谁知道一份明确的文档 甚至是来自可靠来源的邮件列表或博客文章 可以证实或否认这种印象 据我了解 Memcac
  • Tkinter tkFileDialog 不存在[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Python 中的 Tkinter 显示打开的文件对话框 我发现的每个示例似乎都很容易使用 但它们都以以下行开头 import tkFileDialog 这行代码给我抛出了一个错误 说 No mo
  • MVC3 - 编译的 Razor 视图找不到 _ViewStart

    我在单独的类库中使用编译的 Razor 视图作为 MVC3 的一种插件系统 我遵循 Chris Van De Steed 的指南here http www chrisvandesteeg nl 2010 11 22 embedding pr