【问题标题】:@Url.Content in separate javascript file using ASPNET MVC 3 and Razor使用 ASP NET MVC 3 和 Razor 的单独 javascript 文件中的 @Url.Content
【发布时间】:2011-12-01 14:03:06
【问题描述】:

我在用这个

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,处理此问题的最佳方法是什么?

提前致谢!吉列尔莫。

【问题讨论】:

    标签: javascript asp.net-mvc google-maps-markers


    【解决方案1】:

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

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

    然后我在javascript中引用ROOT变量:

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

    【讨论】:

    • 好主意!谢谢!我通过使用 html 帮助程序创建脚本来即兴创作,因为我的脚本必须注入到多个布局中,再次感谢!
    • "~/" 已经以“/”结尾——如果将这两个加在一起,您的 URL 的开头会以“//”结尾。它应该仍然可以工作,但只需键入 (ROOT + 'Content/Images/Image.png');
    • 你会如何为 css 图片做这个?
    【解决方案2】:

    另一种解决方案是完全通过 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>
    

    您现在甚至可以在 javascript 文件中使用模型!

    public ActionResult MyJavascriptThroughRazor()
    {
        var someModel = ...
        return PartialView("filenamewithcsjsextension",someModel);
    }
    

    【讨论】:

    • 我认为这是一个更好的解决方案。我在这里看到的唯一缺点是自定义文件格式无法从 IDE 获得良好的语法支持。然而,这可以定制......
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多