如何在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类型之外的任何东西。

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

如何在ASP中访问资源.. NET Views文件夹

可以编辑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文件夹中,并且使用捆绑功能将每个视图的资源打包。