代码之家  ›  专栏  ›  技术社区  ›  Adrian Grigore

在JavaScript代码中嵌入恒定的服务器端标记的最佳方法是什么?

  •  2
  • Adrian Grigore  · 技术社区  · 15 年前

    我有很多javascript函数,它们依赖于一些服务器端常量(比如我的资源文件中的字符串)。在开发它们的时候,我将javascript代码保存在视图头中,这样我就可以在javascript代码中简单地使用服务器端标记,但是现在我想将javascript函数移动到一个单独的文件中。

    我不能使用常规的JS文件,因为服务器不会解释它,所以嵌入在那里的服务器标签是无用的。我也不想在页面中定义变量,因为这看起来很尴尬而且容易出错。

    我所做的是创建一个新的ASPX文件,将JavaScript函数放在那里,并在主模板中包含该ASPX文件,而不是常规的JS文件。这似乎有点不正统,但似乎工作得很好。

    我的方法有什么缺点我没有考虑到吗?或者有更好的(不那么模糊的)方法吗?

    编辑 附加问题:我应该在包含的脚本文件中使用doctype吗?毕竟,脚本文件已经包含在脚本标记中了。我尝试模拟常规的JS文件,所以没有指定任何doctype。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Wyatt Barnett    15 年前

    使用视图和MVC的模板化功能是实现这一点的一个很好的方法。它很容易维护,很容易理解,并且可以很快完成工作。唯一真正的诀窍是让它提供正确的内容类型。这样做:

        public ActionResult ConfigurationSettings()
        {
            Response.ContentType = "text/javascript";
            return View(Configuration);
        }
    

    实际上可以得到文本/HTML内容类型。诀窍是确保你得到最后一个词,把它添加到你的控制器中:

        protected override void Execute(System.Web.Routing.RequestContext requestContext)
        {
            base.Execute(requestContext);
            requestContext.HttpContext.Response.ContentType = "text/javascript";
        }
    

    您将得到正确的内容类型;viewresult似乎强制它使用text/html。

        2
  •  3
  •   James Conigliaro    15 年前

    文件扩展名,不管是JS、ASPX、ASHX、BLA、FOO,不管什么都不重要。如果服务器端生成的javascript不是特定于某个页面的,那么创建一个aspx页面来呈现javascript就可以了。

    我们经常使用HTTP处理程序在系统中生成动态javascript。我们还确保将响应头设置为text/javascript,以便让客户机浏览器知道我们正在发送回javascript。

        3
  •  1
  •   mckamey    15 年前

    我们使用 ScriptDataBlock control from JsonFx 向页面本身发出变量。它就像一个字典,其中键是变量名(例如“mynamespace.myvar”),值是一个普通的c值(包括整个对象)。控件将发出适当的命名空间生成和类型转换为本机JavaScript类型。所以从这个意义上说,它最终不是“尴尬”或“容易出错”:

    myDataBlock["MyApp.myVar"] = myObject;
    

    如果您正在执行外部文件,那么一般的.ashx处理程序可能是您的最佳选择。它将比整个ASPX页面更轻,并为您提供对输出的非常原始的控制。您需要确保的是将“content type”响应头设置为“text/javascript”(技术上不正确,但最常见的mime类型),对于不尊重内容类型头的Internet Explorer,还将“content disposition”头设置为“inline;myscriptname.js”,以便它知道内容的扩展。

    另外,如果这些确实是“常量”而不是运行时计算的数据,那么您需要将“expires”头设置为将来的某个日期,以鼓励浏览器缓存结果。这将进一步减少您的服务器请求。

    编辑: 如果正在创建javascript,则没有doctype。doctype仅用于标记。

        4
  •  1
  •   swilliams    15 年前

    您正在使用MVC框架(您的问题被标记为这样)对吗?如果是这样,您可以创建一个操作,该操作返回将在页面加载时执行的JavaScript结果:

    public class JSController : Controller {
        public ActionResult Headers() {
            // create your variables here
            return JavaScript("alert('hi');");
        }
    }
    

    然后您可以将其添加到您的ASPX/母版页:

    <script src="/JS/Headers" type="text/javascript"></script>