将js文件放在views文件夹中

时间:2012-03-08 23:19:28

标签: asp.net-mvc-3 routes

我正在尝试将我的javascript文件与我的观点放在一起。

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

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

根据以下SO问题:ASP.NET MVC - Where do you put your .js files if you dont want to store them in /Scripts?

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

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{file}.js");
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    }

如何在我的观点旁边存储和引用我的js文件?

3 个答案:

答案 0 :(得分:27)

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

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

对于IIS7:

    

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

<强>解决方案

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

<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>

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

答案 1 :(得分:2)

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

<强>解决方案

为了达到这个目标,我使用自定义的HtmlHelper和一个控制器进行javascript调用。

的HtmlHelper

    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 + "'/>");

    }

JScript控制器

    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");
    }

完成后,您只需在View / PartialView

中添加以下代码即可
@Html.JScriptBlock()

答案 2 :(得分:2)

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

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

<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />