如何在ASP中访问资源.. NET Views文件夹
本文关键字:资源 NET Views 文件夹 访问 ASP | 更新日期: 2023-09-27 18:08:40
视图文件夹中的资源是CSS,视图内使用的图像,现在我知道它是不同的,然后它的意思是什么,我们已经把所有的内容文件夹,但我正在寻找更好的方法来管理它。
我们有一个非常大的MVC 4,有很多区域,每个区域有很多视图。为了维护一切,我们在contents文件夹中创建了类似的文件夹结构,以相应地分发CSS和图像。
但是问题是,在视图中引用每个资源。它变得难以跟踪,这是文件夹结构。
- 区域
- 应用程序
- <
- 控制器/gh>
- 视图
- 项目
- Search.cshtml
- 用户
- Account.cshtml
- 项目
- 应用程序
- 内容
- common.less
- 应用程序
- app.less
- some-button.png
- projects.less
- users.less
现在问题出现了,当我们有太多的资源和交叉引用是困难的,当我们做用户界面的变化,新的视图出现在图片随着项目的增长。
我希望有以下格式的资源,
- 区域
- 应用程序
- <
- 控制器/gh>
- 视图
- 项目
- Search.cshtml
- search.less
- some-button.png
- 用户
- Account.cshtml
- account.less
- 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,取景器找不到它们,我也需要将它们作为静态下载,除了CSHTML, aspx和注册mime类型之外的任何东西。
在此基础上,我们还为手机和平板电脑提供了显示模式,这使得管理资源变得更加困难。
可以编辑web。通过添加*来允许访问除.cshtml文件之外的任何文件。cshtml到路径参数
<system.webServer>
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode"
type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
不能在Views文件夹中放置任何需要提供给浏览器的内容。这包括CSS(或更少),图像,javascript,无论什么…
这样做的原因是MVC不允许web请求直接访问Views文件夹中的任何内容。视图通常包含代码,这些代码可以显示有关服务器的内部信息。有时人们甚至会做一些愚蠢的事情,比如在视图代码中放入用户名和密码。
这是为了防止人们直接在浏览器中输入以下内容:
http://yoursite/Views/Home/index.cshtml
,以便下载CSHTML文件
因此,您根本不能在Views文件夹或任何子文件夹中放入您希望浏览器下载的任何内容。
如果你查看你的Views文件夹,你会看到它有自己的web。配置文件。在该文件中,您将发现以下部分,其中添加了一个HttpHandler,用于阻止对Views文件夹中的任何内容的访问。我不建议删除它,因为这会使您的代码容易受到攻击。
<system.webServer>
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"
type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>
我不知道为什么不能将UI依赖项仍然保存在Contents文件夹中,并且使用捆绑功能将每个视图的资源打包。