Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@使用aspnetmvc3和Razor将Url.Content保存在单独的javascript文件中_Javascript_Asp.net Mvc_Google Maps Markers - Fatal编程技术网

@使用aspnetmvc3和Razor将Url.Content保存在单独的javascript文件中

@使用aspnetmvc3和Razor将Url.Content保存在单独的javascript文件中,javascript,asp.net-mvc,google-maps-markers,Javascript,Asp.net Mvc,Google Maps Markers,我在用这个 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 =

我在用这个

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的image)

Razor不解析javascript文件中的@Url.Content,处理这个问题的最佳方法是什么


提前谢谢!Guillermo.

我通常在页面的开头放一个这样的块:

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

另一个解决方案是完全通过RazorViewEngine呈现JS文件。这样,您就可以轻松地在Javascript文件中使用Razor语法:

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>

好主意!谢谢我即兴使用html助手创建脚本,因为我的脚本必须被注入到多个布局中,再次感谢!“~/”已以“/”结尾——如果将这两个字符加在一起,则URL开头将以“/”结尾。它应该仍然可以工作,但只需键入(ROOT+‘Content/Images/Image.png’)就更优雅了;对于css图像,您将如何做到这一点?我认为这是一个更好的解决方案。我在这里看到的唯一缺点是,自定义文件格式无法从IDE获得良好的语法支持。然而,这是可以定制的。。。
   <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>
public ActionResult MyJavascriptThroughRazor()
{
    var someModel = ...
    return PartialView("filenamewithcsjsextension",someModel);
}