JavaScript:__ doPostBack中的多个参数

时间:2013-01-23 15:14:42

标签: javascript asp.net postback

首先,我发现的唯一帖子(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
}

欢迎任何帮助。

此致 贡纳尔

3 个答案:

答案 0 :(得分:13)

您可以将这两个值作为一个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&gt; = 4.0,我相信你可以反序列化为通用的touple并避免创建SomeDTO。修改:More information about deserializing to dynamic types

答案 1 :(得分:3)

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

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

您的客户端脚本应包含ClientID值以处理服务器端命名容器修改。使用<%= expression %>语法(表达式构建器)要求您的脚本(或至少脚本的这一部分)保留在.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对其进行编码。

答案 2 :(得分:2)

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

例如

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

然后您可以将此传递给回发的参数,并且在检查回发参数时,只需根据您的speration字符拆分字符串(在本例中为';')