【发布时间】:2013-11-25 08:32:04
【问题描述】:
我正在触发 aspx 页面中的回发事件,如下所示:
__doPostBack('AddNewEmployeeType', "empl", "sick");
后面的代码:
string val = Request.Params.Get("__EVENTTARGET");
通过上面的代码,我只能获得一个第一个值,但我的意图是获得所有三个参数值。我怎样才能做到这一点?
【问题讨论】:
我正在触发 aspx 页面中的回发事件,如下所示:
__doPostBack('AddNewEmployeeType', "empl", "sick");
后面的代码:
string val = Request.Params.Get("__EVENTTARGET");
通过上面的代码,我只能获得一个第一个值,但我的意图是获得所有三个参数值。我怎样才能做到这一点?
【问题讨论】:
使用__EVENTARGUMENT:
string parameter = Request["__EVENTARGUMENT"];
string val = Request.Params.Get("__EVENTTARGET"); // AddNewEmployeeType
Here's a tutorial: Understanding the JavaScript __doPostBack Function
如果您需要将多个参数传回代码隐藏,您需要自己用分隔符将其拆分。例如,您可以使用管道 |:
__doPostBack('AddNewEmployeeType', "empl|sick");
在代码隐藏中:
string parameter = Request["__EVENTARGUMENT"];
string[] allParams = parameter.Split('|');
【讨论】:
__doPostBack 函数仅使用一个参数调用时,__EVENTARGUMENT 中的值可能类似于“未定义”。这取决于浏览器。当请求不需要数据时,我建议发送一个空字符串作为第二个参数。
您对 __doPostBack 的调用在技术上不正确。如果您检查 ASP.NET 页面的源代码,您将看到该函数:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
注意它只有两个参数。如果需要传递更多的值,则需要将它们填充到 eventArgument 参数中。
您如何执行此操作取决于您 - 使用逗号分隔的列表、JSON 或任何适合您的方式,并在服务器上解析该值(通过访问 Request["__EVENTARGUMENT"])。
【讨论】:
回发不应该这样处理。如果一个控件正在引发回发,并且它是一个用户控件,它应该实现IPostBackDataHandler。你应该给它分配一个EventHandler,即使它是一个自定义的。
https://msdn.microsoft.com/pt-br/library/system.web.ui.ipostbackdatahandler(v=vs.110).aspx
【讨论】: