【问题标题】:JavaScript: Multiple parameters in __doPostBackJavaScript:__doPostBack 中的多个参数
【发布时间】:2013-01-07 02:56:37
【问题描述】:

首先,我发现的唯一一篇关于这个的帖子 (calling-multiple-dopostback-from-javascript) 对我的问题没有帮助,所以我不相信这个帖子是重复的。

我的 ASPX 网页中有这个 JavaScript 函数,其中包含一个 __doPostBack 函数:

function OpenSubTable(bolID, controlID) {
  // code
  __doPostBack('UpdatePanelSearch', bolID);
  // more code
}

完美运行,我可以像这样将 bolID 的值放入我的代码中:

protected void UpdatePanelSearch_Load(object sender, EventArgs e)
{
  var bolID = Request["__EVENTARGUMENT"];
  // code
}

问题是,我必须通过回发传递 2 个不同的值。有什么简单的解决方案吗?显然这样的事情是行不通的:

function OpenSubTable(bolID, controlID) {
  // code
  __doPostBack('UpdatePanelSearch', bolID, controlID); // not that simple, i'm afraid :(
  // more code
}

欢迎任何帮助。

问候, 贡纳尔

【问题讨论】:

  • @jbabey 可能有最简单的答案,但推出自己的“doPostBack”功能也不难。它需要做的就是设置几个隐藏输入字段的值,然后提交表单。非常简单,即使对于初学者也是如此。
  • @Cyborgx37 是的,如果(出于某种奇怪的原因)JSON 是不可能的,我会选择隐藏输入。一般来说,除非万不得已,否则您不希望使用隐藏的输入来混淆 HTML。
  • @jbabey 您可以根据需要使用 jQuery 在 DOM 中创建字段。保持您的 HTML 干净。或者,您可以将值放在 URL 中,但我通常不赞成 POST 请求的这种方法(这是 WebForms 通常使用的)。您的方法可能仍然是我推荐的方法。

标签: javascript asp.net postback


【解决方案1】:

您可以将这两个值作为一个 JSON 字符串传递:

function OpenSubTable(bolID, controlID) {
  __doPostBack('UpdatePanelSearch', JSON.stringify({ bolID: bolID, controlID: controlID}));
}

然后在服务器上解析:

protected void UpdatePanelSearch_Load(object sender, EventArgs e)
{
  SomeDTO deserializedArgs = 
      JsonConvert.DeserializeObject<SomeDTO>(Request["__EVENTARGUMENT"]);
  var bolID = deserializedArgs.bolID;
  var controlID = deserializedArgs.controlID;
}

public class SomeDTO
{
    public string bolID { get; set; }
    public string controlID { get; set; }
}

如果您使用.Net >=4.0,我相信您可以反序列化为一个通用的touple,而不必创建SomeDTO。编辑:More information about deserializing to dynamic types

【讨论】:

  • 这就像一个魅力,谢谢。我必须仔细看看 JSON,直到现在我才在我的项目中使用它。另外,我没有在我的 VS 中安装 Newtonsoft.Json framework,但这很容易解决。
【解决方案2】:

考虑将您的数据放在服务器端隐藏字段中,然后在回发后读取该数据。

<asp:HiddenField id="Data1HiddenField" runat="server" />
<asp:HiddenField id="Data2HiddenField" runat="server" />

您的客户端脚本应包含 ClientID 值以处理服务器端命名容器修改。使用&lt;%= expression %&gt; 语法(表达式生成器)需要在.aspx 文件中维护您的脚本(或至少这部分脚本)。如果您在外部文件中维护您的 JavaScript,您可以“注册”一个简单的函数,该函数由您的主 JavaScript 调用以移动数据并组合该函数服务器端以及所需的ClientIDs。见ClientScriptManager.RegisterClientScriptBlock()

var data1 = "data value 1";
var data2 = "data value 2";
$("#<%= Data1HiddenField.ClientID %>").val(data1);
$("#<%= Data2HiddenField.ClientID %>").val(data2);

您的服务器端代码如下所示:

string data1 = Data1HiddenField.Value;
string data2 = Data2HiddenField.Value;

当然还有其他技术可以传递多个数据值,但我发现这既简单又易于维护。如果需要,您可以传递各种数据并使用 JSON 对其进行编码。

【讨论】:

    【解决方案3】:

    我之前通过构建和拆分字符串使用了多个参数。

    例如

    string args = String.Format("{0};{1}", bolID, ControlID);
    

    然后您可以将其传递给回发的参数,在检查回发参数时,只需根据您的操作字符拆分字符串(在本例中为“;”)

    【讨论】:

    • 你是如何在 javascript 中执行 String.Format 的? :P
    • 我不是,它的 c# 服务器端,准备存储在隐藏字段中,web 方法或转换为 javascript。只是和例子:)
    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 2018-07-02
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多