Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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/9/javascript/458.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
Asp.net 什么';在javascript代码中嵌入常量服务器端标记的最佳方法是什么?_Asp.net_Javascript_Asp.net Mvc_Iis - Fatal编程技术网

Asp.net 什么';在javascript代码中嵌入常量服务器端标记的最佳方法是什么?

Asp.net 什么';在javascript代码中嵌入常量服务器端标记的最佳方法是什么?,asp.net,javascript,asp.net-mvc,iis,Asp.net,Javascript,Asp.net Mvc,Iis,我有一组javascript函数,它们依赖于一些服务器端常量(例如我的资源文件中的字符串)。在开发它们时,我将javascript代码保存在视图头中,因此我可以在javascript代码中简单地使用服务器端标记,但现在我想将javascript函数移动到一个单独的文件中 我不能使用常规的js文件,因为服务器不会对其进行解释,这使得嵌入其中的服务器标记毫无用处。我也不想在页面中定义变量,因为这样看起来很笨拙,而且容易出错 我所做的是创建一个新的aspx文件,将javascript函数放在那里,并在

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

我不能使用常规的js文件,因为服务器不会对其进行解释,这使得嵌入其中的服务器标记毫无用处。我也不想在页面中定义变量,因为这样看起来很笨拙,而且容易出错

我所做的是创建一个新的aspx文件,将javascript函数放在那里,并在主模板中包含该aspx文件,而不是常规的js文件。这似乎有点不合常规,但似乎效果不错

我的方法是否有任何缺点我没有考虑到?或者有更好(不那么晦涩)的方法吗


编辑额外问题:我应该在包含的脚本文件中使用DOCTYPE吗?毕竟,脚本文件已经包含在脚本标记中。我试图模仿常规的js文件,所以我没有指定任何DOCTYPE。

文件扩展名,无论是js、aspx、ashx、bla、foo,都不那么重要。如果服务器端生成的javascript不是特定于页面的,那么创建一个ASPX页面来呈现javascript应该是可以的

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

我们使用将变量发送到页面本身。它就像一个字典,其中键是变量名(例如“MyNamespace.myVar”),值是一个普通的C值(包括整个对象)。该控件向本机JavaScript类型发出适当的命名空间生成和类型转换。因此,从这个意义上讲,它不会变得“笨拙”或“容易出错”:

如果您正在处理一个外部文件,那么泛型.ashx处理程序可能是您最好的选择。它将比整个aspx页面更轻,并为您提供对输出的原始控制。您需要确保的是将“Content Type”响应头设置为“text/javascript”(技术上不正确,但最常见的MIME类型),对于倾向于不尊重Content Type头的Internet Explorer,也将“Content Disposition”头设置为“inline;MyScriptName.js”,以便它知道内容的扩展名

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


编辑:如果您正在创建JavaScript,则无DocType。DocType仅用于标记。

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

public class JSController : Controller {
    public ActionResult Headers() {
        // create your variables here
        return JavaScript("alert('hi');");
    }
}
然后您可以将其添加到您的aspx/母版页:

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

使用视图和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。

谢谢您的回答。doctype真的有必要吗(请参见上面的编辑)?如果是,javascript文件的确切语法是什么?我的谷歌搜索不是很成功。从浏览器的角度来看,文档类型真的不是必需的。我们经常使用缓存服务器,如akamai,并设置规则来缓存某些内容类型,如样式表和JavVaScript,时间更长。使用doc type头,我们无需依赖文件名/扩展名即可实现缓存。感谢您的回答,但您的编辑让我感到困惑。我决定按照您的建议使用asxh文件,并且只在其中添加javascript代码。我应该使用doctype吗?另外,javascript doctype的正确语法是什么?我试着用谷歌搜索它,但是找不到任何关于这个的信息。很抱歉给你带来困惑。JavaScript没有DocType,因为DocType是一个SQML声明,用于描述用于验证标记的DTD。JavaScript响应应该只包括脚本,而不包括标记(包括脚本标记)。通过这种方式,您可以将处理程序作为外部脚本引用,浏览器将下载它,就像它是一个静态文件一样。Content-Type是指定MIME类型的头文件(例如“text/javascript”)而DocType是HTML页面顶部的一个标记。也许这就是混淆的地方。对于JavaScript文件,内容类型很好,但DocType不适用。很抱歉,这么麻烦,但是在我的场景中,ashx文件到底有什么帮助呢?我可以控制内容类型头,但如何输出JavaScript解析并替换服务器端标记的代码?从文件加载脚本并通过context.Response.Write inside ProcessRequest写入不会替换标记。有趣的是,您正在使用标记进行替换?An.ashx没有用于构建脚本的设计器界面。当我做这些事情时,我使用格式化字符串s并通过
{0}
进行替换。无论哪种方式,在发出
之类的信息时,都必须小心正确编码字符串等。我还在JsonFx(JSON序列化程序的扩展)中使用ECMAScript编写器正确地将字符串、日期、对象、数组等编码为JavaScript文本。这样更安全,而且您永远不必担心额外的引号字符会把事情弄糟。您在
    protected override void Execute(System.Web.Routing.RequestContext requestContext)
    {
        base.Execute(requestContext);
        requestContext.HttpContext.Response.ContentType = "text/javascript";
    }