@Url.Content в отдельном файле javascript с использованием ASPNET MVC 3 и Razor

я использовал это

if (ret = 1)
    iconType = new google.maps.MarkerImage('@Url.Content("~/Content/images/image.png")');
else if (ret = 2)
    iconType = new google.maps.MarkerImage('@Url.Content("~/Content/images/image2.png")');
else if (ret = 3)
    iconType = new google.maps.MarkerImage('@Url.Content("~/Content/images/image3.png")');

в представлении (ASPNET MVC 3), теперь я перемещаю код в отдельный файл javascript (я использую его, потому что в зависимости от доступного значения я устанавливаю изображение элемента управления image.png, image2.png или image3. png).

Razor не анализирует @Url.Content внутри файла javascript. Как лучше всего с этим справиться?

Заранее спасибо! Гильермо.


person polonskyg    schedule 05.10.2011    source источник


Ответы (2)


Я обычно ставлю такой блок в начале страницы:

<script>
    var ROOT = '@Url.Content("~")';
</script>

И затем я ссылаюсь на переменную ROOT в javascript:

if (ret = 1)
    iconType = new google.maps.MarkerImage(ROOT + '/Content/images/image.png');
else if (ret = 2)
    iconType = new google.maps.MarkerImage(ROOT + '/Content/images/image2.png');
else if (ret = 3)
    iconType = new google.maps.MarkerImage(ROOT + '/Content/images/image3.png")');
person AHM    schedule 05.10.2011
comment
Хорошая идея! Спасибо! Я импровизировал, создав скрипт с помощью html-помощника, так как мои скрипты нужно вставлять в несколько макетов, еще раз спасибо! - person k25; 08.07.2012
comment
~/ уже заканчивается на / -- если вы добавите эти два вместе, вы получите // в начале ваших URL-адресов. Это все еще должно работать, но более изящно просто набрать (ROOT + 'Content/Images/Image.png'); - person BrainSlugs83; 29.04.2013
comment
Как бы вы сделали это для изображения css? - person Joel Coehoorn; 15.02.2016

Другое решение — полностью отображать ваши JS-файлы с помощью RazorViewEngine. Таким образом, вы можете легко использовать синтаксис Razor в своем файле Javascript:

public class CustomRazorViewEngine : BuildManagerViewEngine
{
    internal static readonly string ViewStartFileName = "_ViewStart";

    public CustomRazorViewEngine()
        : this(null)
    {
    }

    public CustomRazorViewEngine(IViewPageActivator viewPageActivator)
        : base(viewPageActivator)
    {
        AreaViewLocationFormats = new[]
                                    {
                                        "~/Areas/{2}/Views/{1}/{0}.cshtml",
                                        "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                                        "~/Areas/{2}/Views/{1}/{0}.csjs",
                                        "~/Areas/{2}/Views/Shared/{0}.cshtml",
                                        "~/Areas/{2}/Views/Shared/{0}.vbhtml",
                                        "~/Areas/{2}/Views/Shared/{0}.csjs"
                                    };
        AreaMasterLocationFormats = new[]
                                        {
                                            "~/Areas/{2}/Views/{1}/{0}.cshtml",
                                            "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                                            "~/Areas/{2}/Views/{1}/{0}.csjs",
                                            "~/Areas/{2}/Views/Shared/{0}.cshtml",
                                            "~/Areas/{2}/Views/Shared/{0}.vbhtml",
                                            "~/Areas/{2}/Views/Shared/{0}.csjs"
                                        };
        AreaPartialViewLocationFormats = new[]
                                            {
                                                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                                                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                                                "~/Areas/{2}/Views/{1}/{0}.csjs",
                                                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                                                "~/Areas/{2}/Views/Shared/{0}.vbhtml",
                                                "~/Areas/{2}/Views/Shared/{0}.csjs"
                                            };

        ViewLocationFormats = new[]
                                {
                                    "~/Views/{1}/{0}.cshtml",
                                    "~/Views/{1}/{0}.vbhtml",
                                    "~/Views/{1}/{0}.csjs",
                                    "~/Views/Shared/{0}.cshtml",
                                    "~/Views/Shared/{0}.vbhtml",
                                    "~/Views/Shared/{0}.csjs"
                                };
        MasterLocationFormats = new[]
                                    {
                                        "~/Views/{1}/{0}.cshtml",
                                        "~/Views/{1}/{0}.vbhtml",
                                        "~/Views/{1}/{0}.csjs",
                                        "~/Views/Shared/{0}.cshtml",
                                        "~/Views/Shared/{0}.vbhtml",
                                        "~/Views/Shared/{0}.csjs"
                                    };
        PartialViewLocationFormats = new[]
                                        {
                                            "~/Views/{1}/{0}.cshtml",
                                            "~/Views/{1}/{0}.vbhtml",
                                            "~/Views/{1}/{0}.csjs",
                                            "~/Views/Shared/{0}.cshtml",
                                            "~/Views/Shared/{0}.vbhtml",
                                            "~/Views/Shared/{0}.csjs"
                                        };

        FileExtensions = new[]
                            {
                                "cshtml",
                                "vbhtml",
                                "csjs",
                            };
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return new RazorView(controllerContext, partialPath,
                             layoutPath: null, runViewStartPages: false, viewStartFileExtensions: FileExtensions,
                             viewPageActivator: ViewPageActivator);
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        var view = new RazorView(controllerContext, viewPath,
                                 layoutPath: masterPath, runViewStartPages: true, viewStartFileExtensions: FileExtensions,
                                 viewPageActivator: ViewPageActivator);
        return view;
    }
}

В ваш глобальный файл asax просто добавьте следующее:

RazorCodeLanguage.Languages.Add("csjs", new CSharpRazorCodeLanguage());
ViewEngines.Engines.Add(new CustomRazorViewEngine());

И добавьте это сопоставление в корень web.config

   <system.web>
          <compilation debug="true" targetFramework="4.0">
                 <assemblies>
                       <add assembly="Newtonsoft.Json" />
                       <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                       <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                       <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                       <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                       <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                 </assemblies>

                 <!--Added-->
                 <buildProviders>
                       <add extension=".csjs" type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor"/>
                 </buildProviders>

Теперь вы даже можете работать с моделью внутри вашего javascript-файла!

public ActionResult MyJavascriptThroughRazor()
{
    var someModel = ...
    return PartialView("filenamewithcsjsextension",someModel);
}
person Beriz    schedule 23.01.2012
comment
Это, я думаю, лучшее решение. Единственный недостаток, который я здесь вижу, заключается в том, что пользовательский формат файла не получит хорошей поддержки синтаксиса в среде IDE. Впрочем, это можно было настроить... - person Romeo Sierra; 23.03.2018