【问题标题】:Reading AppSettings from javascript从 javascript 读取 AppSettings
【发布时间】:2012-10-06 02:05:18
【问题描述】:

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

有什么想法吗?

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

【问题讨论】:

  • 刚刚发布了一个解决方案。请看一看。

标签: javascript asp.net c#-4.0


【解决方案1】:

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

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

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

【讨论】:

  • 这回答了我关于“为什么”会发生这种情况的问题。谢谢你。这里发布了一些其他很棒的“解决方法”,但我问题的根源是“为什么”。谢谢大家。
【解决方案2】:

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

  1. 我创建了一个名为 DynamicJs.aspx.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>
    

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

【讨论】:

  • 将代码作为列表的一部分发布时,您必须在每行中添加额外的四个空格以使其格式正确。请参阅我的编辑。 :)
  • 感谢影子向导。我确实在格式上苦苦挣扎。
  • 非常好的方法。看了一会儿,这是唯一有帮助的答案。谢谢。
【解决方案3】:

一种方法是使用自定义控件页面。在您的网站中添加一个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" %>

** 此标记位于aspx 页面中的&lt;%@ Page %&gt; 标记之后

然后在你的aspx页面的head部分调用这样的控件

<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>

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

【讨论】:

  • 有趣的方法,但我发现动态生成 javascript 会导致可维护性差。拥有静态脚本并动态生成调用并将动态数据作为参数传递会更好。细微的差别,但更好地分离了关注点。我有一个内置在 MVC 中的大型系统,其中包含各种动态生成的脚本,这些脚本内联在视图中,这是一场噩梦。我再也不会走那条路了。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2015-01-27
    相关资源
    最近更新 更多