Asp.net mvc 3 将js文件放置在“视图”文件夹中

Asp.net mvc 3 将js文件放置在“视图”文件夹中,asp.net-mvc-3,routes,Asp.net Mvc 3,Routes,我正在尝试将我的javascript文件与我的视图放在一起 我有以下js文件位置。 /Views/Home/Home.js 但是,当使用脚本标记引用时,会导致404错误 根据以下问题: 我将file.js添加到我的注册路由中。(没有解决问题) 如何在视图旁边存储和引用js文件?问题是,出于安全原因,视图文件夹中的web.config会阻止对该文件夹中文件的所有请求。这是您将在配置文件中找到的内容: <httpHandlers> <add path="*" verb="*"

我正在尝试将我的javascript文件与我的视图放在一起

我有以下js文件位置。 /Views/Home/Home.js

但是,当使用脚本标记引用时,会导致404错误

根据以下问题:

我将file.js添加到我的注册路由中。(没有解决问题)


如何在视图旁边存储和引用js文件?

问题是,出于安全原因,视图文件夹中的web.config会阻止对该文件夹中文件的所有请求。这是您将在配置文件中找到的内容:

<httpHandlers>
  <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>

对于IIS7:


解决方案

您可以更改通配符以仅捕获.cshtml文件

<httpHandlers>
  <add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>



使用此通配符,.js文件将不会被阻止。

出于安全原因,我个人不喜欢使用httpHandlers。我想做完全相同的事情,以防止必须维护相同的文件夹结构两次(在视图和脚本文件夹中)。因此,我们的目标是将.js存储在与my.cshtml相同的文件夹中,并且不再有404错误

解决方案

为了达到这个目标,我使用了一个定制的HtmlHelper和一个用于javascript调用的控制器

HtmlHelper

完成后,只需在视图/PartialView中添加以下代码

@Html.JScriptBlock()

在我看来,这是一个好方法:它使代码保持简单,并且不涉及其他资源类型的安全问题

只需在处理程序部分添加以下内容:



这是可行的,但我认为最好不要将js文件放在“视图”文件夹中。毫无疑问,根据答案将您明确希望允许的文件列为白名单会更安全,而不仅仅是过滤cshtml文件本身的请求。对于我来说,我构建了一个MVC设置,它大量使用angular。我还使用require js修改了所有内容,因此只有使用特定javascript片段的视图才会导致加载这些java脚本文件。因此,我划分了所有内容,将与mvc文件夹关联的angular controller放在具有视图的文件夹中非常有意义。所以我有像views\ControllerName\ControllerName.cshtml和views\Controller\ControllerName Controller.js这样的东西。我实际上喜欢这个,但是获取这些静态文件不是很慢吗,因为它经过很多mvc调用程序和方法,直到到达实际的文件?
<httpHandlers>
  <add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>
<handlers>
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
    public static MvcHtmlString JScriptBlock<TModel>(
        this HtmlHelper<TModel> html
    )
    {
        // Get the physical path of the .js file we are looking for.
        string path = ((System.Web.Mvc.RazorView)html.ViewContext.View).ViewPath.Replace(".cshtml", ".js");
        path = HostingEnvironment.MapPath(path);

        if (!File.Exists(path))
            return null;

        // We store the physical path in a session variable with GUID as the key
        string guid = Guid.NewGuid().ToString();
        HttpContext.Current.Session[guid] = path;

        // Create the script block where the src points to the JScript controller.  We give the GUID as parameter.
        return MvcHtmlString.Create("<script src='/JScript/?id=" + guid + "'/>");

    }
    public ActionResult Index(string id)
    {
        // id correspond to the guid generated by the MSRJScript helper

        // We look if the physical path of the .js is available in the session variables
        if(Session[id] == null)
            return new HttpStatusCodeResult(HttpStatusCode.Forbidden);

        // If the physical path was found, we simply send the file back to the browser.
        string path = Session[id].ToString();
        Session.Remove(id);

        return File(path, "application/javascript");
    }
@Html.JScriptBlock()
<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />