Размещение js-файлов в папке представлений - PullRequest
12 голосов
/ 09 марта 2012

Я пытаюсь разместить мои файлы JavaScript с моими представлениями.

У меня есть следующее расположение файла js. /Views/Home/Home.js

Однако при ссылке на тег скрипта это приводит к ошибке 404.

Согласно следующему вопросу SO: ASP.NET MVC - куда вы помещаете свои файлы .js, если не хотите их хранить в / Scripts?

Я добавил file.js в мои маршруты регистрации. (Не решил проблему)

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

Как я могу хранить и ссылаться на мои файлы js рядом с моими представлениями?

Ответы [ 3 ]

27 голосов
/ 09 марта 2012

Проблема в том, что по соображениям безопасности файл web.config, находящийся в папке Views, блокирует все запросы к файлам в этой папке.Вот что вы найдете в файле конфигурации:

<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 не будут заблокированы.

3 голосов
/ 14 мая 2015

На мой взгляд, это хороший способ: он делает код простым и не затрагивает проблему безопасности с другими типами ресурсов.

Просто добавьте в раздел обработчики следующее:

<add name="JavaScriptHandler" path="*.js" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
2 голосов
/ 07 мая 2015

Мне лично не нравится играть с httpHandlers по соображениям безопасности.Я хотел сделать то же самое, чтобы избежать необходимости поддерживать одну и ту же структуру папок дважды (в представлении и в папке скриптов).Итак, цель состоит в том, чтобы сохранить файлы .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 Controller

    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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...