2

我正在尝试创建一个检索 web.config 应用程序设置值的函数。如果我将代码alert('<%=ConfigurationManager.AppSettings["facebookAppID"].ToString() %>')直接放在 .ascx 文件中,则此方法有效。但是,如果我从该 .ascx 文件调用 .js 文件中的一个通用函数(以便拥有一个通用全局函数),它就不起作用......即它不评估值,而只是返回字符串"<%=System.ConfigurationManager.AppSettings[\"facebookAppID\"].ToString(); %>"

关于为什么会这样的任何想法?

function GetappId() {
    var k = "<%=System.ConfigurationManager.AppSettings["facebookAppID"].ToString(); %>"
    alert(k);
return k
}
4

4 回答 4

1

常见的 .js 文件,如果你像这个脚本 src="somescript.js" /script 那样包含它们,它们会加载到客户端浏览器上,并且永远不会在服务器上处理。

使用 javascript 加载文件/值的唯一方法是执行和 ajax 调用到返回 JSON 或文本的 aspx 页面。

http://api.jquery.com/jQuery.ajax/

于 2012-10-16T02:49:51.030 回答
1

请注意,这仅适用于 web.config 中的 appSettings 部分

  1. 我创建了一个.aspx名为DynamicJs.aspx的文件,如下所示。它将从 appSettings 中获取键值对并构造一个 JSON 字符串。

    后面的代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Configuration;
    using System.Web.Script.Serialization;
    using System.Collections.Specialized;
    
    public partial class DynamicJs : System.Web.UI.Page
    {
        private string settingsJson = string.Empty;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            NameValueCollection nvc = ConfigurationManager.AppSettings;
            var dict = new Dictionary<string, string>();
            foreach (string key in nvc.Keys)
            {
                dict.Add(key, nvc[key]);
            }
            settingsJson = new JavaScriptSerializer().Serialize(dict);
        }
    
        public string GetSettingsJson() {
            return settingsJson;
        }
    }
    

    HTML(请注意内容类型,因为它会发出 JavaScript)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="DynamicJs.aspx.cs" Inherits="DynamicJs" ContentType="text/javascript" %>
    
    function GetValue(key){
        var data= <%=GetSettingsJson() %>;
        return data[key];
    }
    
  2. 在消费页面中包含 DynamicJs.aspx,如下所示:

    <script src="DynamicJs.aspx" type="text/javascript"></script>
    
  3. 使用以下内容从配置中获取值

    <script>
        alert(GetValue("key2"));
    </script>
    

这绝对不是最优雅的方式,但我认为它会帮助你实现你想要的。

于 2012-10-16T06:53:04.800 回答
1

一种方法是使用自定义控件页面。在您的网站中添加一个Web User Control (.ascx)页面并将您的脚本代码放入其中

<script type="text/javascript">
    function GetappId() {
        var k = "<%=System.ConfigurationManager.AppSettings["facebookAppID"].ToString(); %>"
        alert(k);
        return k
    }
</script>

现在将您的控件注册到您想要这样的GetappId功能的页面

<%@ Register TagPrefix="Scrpt" TagName="GlobalScrpt" Src="~/WebUserControl.ascx" %>

** 此标签<%@ Page %>aspx页面中的标签之后

然后在aspx页面的头部调用这样的控件

<head runat="server">
    <title></title>
    <Scrpt:GlobalScrpt ID="Scrpt1" runat="server" />
</head>

** 确保你有runat="server"你的标题标签

现在您可以在页面的任何位置调用GetappId()并获得所需的结果。aspx

更新 - 另一个解决方案

另一种方法是创建一个aspx(假设页面是Default1.aspx)页面,页面后面没有单独的代码,并将您的代码放在那里

<%@ Page Language="C#" %>

function GetappId()
{
    var k = "<%=System.ConfigurationManager.AppSettings["facebookAppID"].ToString(); %>";
    alert(k);
}

然后在要调用 GetappId 的页面中将第一aspx页添加为 javascript 页面。

<head runat="server">
    <title></title>
    <script type="text/javascript" src="Default1.aspx"></script>
</head>

现在在页面的任何位置调用您的函数。

于 2012-10-16T08:03:42.887 回答
0

ClientScriptManager RegisterClientScriptBlock()您可以使用or将 javascript 注入您的标记,RegisterStartupScript()并将您的应用程序设置内联或调用方法并将设置作为参数传递。

另一种方法是呈现一个隐藏字段并在其中包含您的设置,然后在您的 javascript 代码中引用它。

于 2012-10-16T04:48:50.447 回答