2011-10-05 55 views
23

我就是用這個@ Url.Content在單獨的JavaScript文件中使用ASPNET MVC 3剃鬚刀

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不解析JavaScript文件中的@ Url.Content,處理這個問題的最佳方法是什麼?

在此先感謝!吉列爾莫。

回答

43

我通常把塊這樣的網頁的開頭:

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

好主意!謝謝!我通過使用html助手創建腳本來即興創作,因爲我的腳本必須注入多個佈局,再次感謝! – k25

+3

「〜/」已以「/」結尾 - 如果您將這兩者加在一起,則最終會在網址開頭加上「//」。它應該仍然可以工作,但只是輸入(ROOT +'Content/Images/Image.png')才更優雅。 – BrainSlugs83

+0

你會如何做到這一點的CSS圖像? –

7

另一種解決方案是使你的JS文件完全通過RazorViewEngine。這樣,您就可以輕鬆地將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); 
} 
+0

[This](http://stackoverflow.com/a/5148405/158074)似乎更容易。 – rsenna