【问题标题】:ASP.NET Core: Finding a View - works in IIS Express debug but not in Kestrel 'published'ASP.NET Core:查找视图 - 在 IIS Express 调试中有效,但在 Kestrel“已发布”中无效
【发布时间】:2016-08-23 00:02:59
【问题描述】:

我花了一个下午的时间在谷歌上搜索,找不到任何与我的问题相符的内容。

我正在为一个简单的网站使用 ASP.NET Core 1.0.0。在 VS 2015 中的 IIS-Express 中调试时,一切正常。但是当我发布站点时(使用内置的 VS2015 工具或手动使用 'dotnet publish'),我得到一个“未找到视图 'xxx”'错误每次我尝试访问页面时。

代码如下:

控制器:

  public class CalcController : Controller
  {
    public IActionResult Index()
    {
        return View();
    }

    ... etc ....

   }

这是我的 Views 文件夹的屏幕截图:

这一切在 VS 2015 中的 IIS Express 中运行良好。但是当我发布并尝试运行已发布的代码时,我得到了这个:

FWIW - 我可以毫无问题地提供静态页面和 js、css 等。

有什么想法吗?

【问题讨论】:

  • 您确定视图包含在发布输出中吗?即,您在已发布的输出中看到了 Views 文件夹并且它具有正确的文件?
  • @joe - 发布的输出是单个 dll(加上所有 MS dll)。 AFAICS 那是应该发生的事情? css/js 文件是从某个 dll 中正确返回的,所以我认为其余的文件都在某个地方?
  • no Views 通常需要像 wwwroot 文件夹和 js 和 css 一样包含在已发布的输出中,我刚刚发布了一个带有详细信息的答案

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

在您的网络应用程序的 project.json 文件中,您需要像这样在发布选项中包含视图(和其他需要的文件),以便它们包含在发布的输出中:

"publishOptions": {
    "include": [
        "wwwroot",
        "Views",
        "Areas/**/Views",
        "sitefiles",
        "dp_keys",
        "nodb_storage",
        "appsettings.json",
        "web.config"
    ]
},

据我所知,视图不是预编译的,至少在默认情况下是这样,尽管可能有一些方法可以做到这一点。

也可以像这样将视图嵌入到 dll 中:

 "buildOptions": {
    "embed": [ "Views/**", "js/**", "css/**" ]
},

我在有控制器的类库项目中这样做,但是你需要有启动逻辑才能让它找到那些嵌入式视图

services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization()
    .AddRazorOptions(options =>
    {  
        options.FileProviders.Add(new EmbeddedFileProvider(
            typeof(SiteManager).GetTypeInfo().Assembly,
            "cloudscribe.Core.Web"
        ));
    })
    ;

【讨论】:

  • 请注意,嵌入 js 和 css 不足以使它们可请求,我使用控制器来渲染嵌入的 js 和 css
  • 做到了!您的解释很有道理...我在 project.json 中添加了“视图”,一切都很好。
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多