C# 如何访问ASP.NET视图文件夹中的资源?
视图文件夹中的资源是CSS,视图中使用的图像,现在我知道这与它的用途不同,我们已经将所有内容都放在内容文件夹中,但我正在寻找更好的方法来管理它 我们有一个非常大的MVC4,有很多区域,每个区域都有很多视图。为了维护所有内容,我们在contents文件夹中创建了类似的文件夹结构,以相应地分发CSS和图像 但问题是,引用视图中的每个资源。跟踪变得很困难,下面是文件夹结构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 内容
- 区域
- 应用程序
- 控制器
- 观点
- 计划
- Search.cshtml
- 使用者
- Account.cshtml
- 计划
- 应用程序
- 内容
- 普通的
- 应用程序
- 无应用程序
- some-button.png
- 项目。无
- 无用户
- 区域
- 应用程序
- 控制器
- 观点
- 计划
- Search.cshtml
- 无搜索
- some-button.png
- 使用者
- Account.cshtml
- 无账户
- some-button.png
- 计划
- 应用程序
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请阅读问题,我们已经将它们放在“内容”文件夹中了,而“内容”文件夹也在视图之外。