@ Url.Content в отдельном файле JavaScript с использованием ASPNET MVC 3 и Razor - PullRequest
25 голосов
/ 05 октября 2011

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

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. Какой лучший способ справиться с этим?

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

Ответы [ 2 ]

47 голосов
/ 05 октября 2011

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

<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")');
8 голосов
/ 23 января 2012

Другое решение - полностью отрисовывать файлы 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.configroot

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