Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何访问ASP.NET视图文件夹中的资源?_C#_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

C# 如何访问ASP.NET视图文件夹中的资源?

C# 如何访问ASP.NET视图文件夹中的资源?,c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,视图文件夹中的资源是CSS,视图中使用的图像,现在我知道这与它的用途不同,我们已经将所有内容都放在内容文件夹中,但我正在寻找更好的方法来管理它 我们有一个非常大的MVC4,有很多区域,每个区域都有很多视图。为了维护所有内容,我们在contents文件夹中创建了类似的文件夹结构,以相应地分发CSS和图像 但问题是,引用视图中的每个资源。跟踪变得很困难,下面是文件夹结构 区域 应用程序 控制器 观点 计划 Search.cshtml 使用者 Account.cshtml 内容

视图文件夹中的资源是CSS,视图中使用的图像,现在我知道这与它的用途不同,我们已经将所有内容都放在内容文件夹中,但我正在寻找更好的方法来管理它

我们有一个非常大的MVC4,有很多区域,每个区域都有很多视图。为了维护所有内容,我们在contents文件夹中创建了类似的文件夹结构,以相应地分发CSS和图像

但问题是,引用视图中的每个资源。跟踪变得很困难,下面是文件夹结构

  • 区域
    • 应用程序
      • 控制器
      • 观点
        • 计划
          • Search.cshtml
        • 使用者
          • Account.cshtml
  • 内容
    • 普通的
    • 应用程序
      • 无应用程序
      • some-button.png
      • 项目。无
      • 无用户
现在,当我们有太多的资源并且交叉引用很困难时,问题就会出现,因为我们更改了用户界面,随着项目的增长,新的视图就会出现

我希望有以下格式的资源

  • 区域
    • 应用程序
      • 控制器
      • 观点
        • 计划
          • Search.cshtml
          • 无搜索
          • some-button.png
        • 使用者
          • Account.cshtml
          • 无账户
          • some-button.png
我怎么能轻松做到

我的每个控制器都派生自一个公共AppController,我们在其中验证用户身份验证和角色。我已经实现了CustomActionInvoker来查找如下视图

private string defaultViewName = "";

protected virtual object GetDefaultViewModel() {
    return null;
}

public virtual ActionResult DefaultView() {

    try
    {
        var view = this.View(defaultViewName);
        if (view == null)
        {
            return HttpNotFound(defaultViewName + " View not found");
        }
        ViewBag.Title = defaultViewName;
    }
    catch
    {
        //Utils.Log(ex);
        //throw;
        return HttpNotFound(defaultViewName + " View not found");
    }            

    return View(defaultViewName, GetDefaultViewModel());
}

protected override IActionInvoker CreateActionInvoker()
{
    return new DefaultViewInvoker(base.CreateActionInvoker(), this);
}

internal class DefaultViewInvoker : ControllerActionInvoker {

    private IActionInvoker parent;
    private CastingWebController wc;

    internal DefaultViewInvoker(IActionInvoker parent, CastingWebController wc)
    {
        this.parent = parent;
        this.wc = wc;
    }

    protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName)
    {
        ActionDescriptor ad  = base.FindAction(controllerContext, controllerDescriptor, actionName);
        if (ad == null) {
            wc.defaultViewName = actionName;
            ad = base.FindAction(controllerContext, controllerDescriptor, "DefaultView");
        }
        return ad;
    }

}
这工作得很好,即使控制器上没有操作方法,它也会分发CSHTML文件。但是,这不适用于CSS和图像

例如

/App/Projects/Search
是很容易处理和服务的,我们看不到原始的CSHTML下载反正

App/Views/Projects/Search.cshtml
我需要一点帮助来访问

/App/Projects/Search.css
/App/Projects/some-button.png
在小路上

/App/Views/Projects/Search.css
/App/Views/Projects/some-button.png
由于这些不是CSHTML,view finder找不到它们,我还需要将它们作为静态下载,除了CSHTML、aspx和注册mime类型之外的任何内容


此外,我们还提供了手机和平板电脑的显示模式,这使得管理资源变得更加困难。

您不能将任何需要提供给浏览器的内容放在“视图”文件夹中。包括CSS(或更少)、图像、javascript等等

原因是出于安全原因,MVC不允许web请求直接访问视图文件夹中的任何内容。视图通常包含代码,这些代码可以显示服务器的内部信息。有时人们甚至会做一些愚蠢的事情,比如在视图代码中输入用户名和密码

这是为了防止人们只在浏览器中键入以下内容:

http://yoursite/Views/Home/index.cshtml
以下载cshtml文件

因此,您无法在“视图”文件夹或任何子文件夹中放置任何希望浏览器下载的内容

如果查看Views文件夹,您将看到它有自己的web.config文件。在该文件中,您将看到以下部分,其中添加了一个HttpHandler,它阻止对Views文件夹中任何内容的访问。我不建议删除它,因为这会使您的代码易受攻击

<system.webServer>
   <handlers>
     <remove name="BlockViewHandler"/>
     <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" 
         type="System.Web.HttpNotFoundHandler" />
   </handlers>
</system.webServer>


我不确定为什么用户界面依赖项仍然不能保留在目录文件夹中,并利用捆绑功能对每个视图的资源进行打包。

您可以在~/Views文件夹中编辑web.config,通过将*.cshtml添加到路径参数,允许访问除.cshtml文件以外的任何内容

<system.webServer>
   <handlers>
     <remove name="BlockViewHandler"/>
     <add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" 
         type="System.Web.HttpNotFoundHandler" />
   </handlers>
</system.webServer>


为什么这些资源在“视图”文件夹中?“视图”文件夹用于。。。视图。@AntP当然我知道,资源是CSS,视图中使用的图像。将它们放在“CSS”和“图像”文件夹中的“视图”文件夹之外。@AntP请阅读问题,我们已经将它们放在“内容”文件夹中了,而“内容”文件夹也在视图之外。