【问题标题】:Host Asp.Net MVC in IIS hides Views-Folders and .cshtmlIIS 中的 Host Asp.Net MVC 隐藏了 Views-Folders 和 .cshtml
【发布时间】:2018-01-23 17:16:07
【问题描述】:

当我在默认 IIS 中托管我的 Asp.Net MVC 时,它既不显示 .cshtml 文件,也不显示 Views 文件夹。即使在目录浏览时,这些文件夹也会丢失。如果我在 Views 文件夹中创建一些文件,我也无法访问它。如果我在另一个文件夹中创建一些文件,我可以访问它。

这是我的路由配置


我认为这应该是一个相当基本的设置问题。我必须手动添加 MVC 支持吗? 我的 IIS 基于 windowsservercore 在我的 docker 容器中运行。设置如下:

FROM microsoft/windowsservercore
SHELL ["powershell"]
RUN Install-WindowsFeature NET-Framework-45-ASPNET ; \  
    Install-WindowsFeature Web-Asp-Net45

【问题讨论】:

  • 我敢打赌这是一个路由问题。你能发布你的路由配置吗?
  • 当我通常在 AzureStack 中将它作为 WebRole 执行时,它总是运行没有错误。我没有更改路由。我现在发布到文件夹中的情况有什么不同吗?
  • BaluJr. - 但是您可以毫无问题地导航到 Web 应用程序的根目录?
  • 不,这是另一个问题...当我在目录浏览中并单击“转到父文件夹”时,它会给出与上面相同的错误消息,而不是显示根文件夹。它进一步尝试转到login.aspx 而不是login.cshtml 什么是正确的。

标签: asp.net asp.net-mvc iis


【解决方案1】:

路由不去 views 它去 controllers。处理然后呈现视图的是控制器。此外,您提供的 URL 与查看位置之间没有物理关联 - 这完全取决于路由的设置方式。

IIS 阻止对Views 文件夹的直接访问是正常且预期的行为,因为浏览器从不直接使用这些文件夹。

默认情况下,视图是基于约定的。他们使用的约定是Views\<ControllerName>\<ActionName>.cshtml。当视图在正确的对应位置时,action 方法可以简单地return View(); 并且视图将被渲染。

视图Views\tst.cshtml在您将视图的虚拟位置传递给View方法(例如return View("~/Views/tst.cshtml");。这是因为它不匹配任何“正常”的 MVC 约定。

由于您没有提供任何关于您的控制器或操作名称的示例(或者即使您有),我将提供一个来自 MVC 模板项目的基本示例。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }
}

有了上面的控制器和Default路由,如果你传递URL/Home/About(Home匹配HomeController,About匹配About方法),About方法就会运行,\Views\Home\About.cshtml处的视图会是渲染。

参考:Understanding Models, Views, and Controllers (C#)

【讨论】:

  • 谢谢。优秀的答案!最后很明显。但是我仍然很困惑,为什么我不明白为什么它以前在 docker 容器之外本地工作。明天我会立即试一试,然后将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多