0

请找到我正在尝试处理的场景:

我有一个 aspx 页面,其内容是通过动态加载各种用户控件来加载的。这些用户控件中的每一个都有自己的控件集,例如文本框、复选框列表或复选框。

单击“保存”按钮时,我想从复选框列表中捕获文本框中和复选框中的数据。

我能够使用以下代码成功地从这些控件中收集数据:

UserControl ctl1 = placeholder.FindControl("user_control_1") as UserControl;
if (ctl1 != null)
{
RadTextBox txtName = ctl1 .FindControl("txtFirstName") as RadTextBox;
if (txtName != null)
{
// Perform required CRUD
}
}

这种方法运行良好,直到我有新的需求。为了满足新的需求,我不得不改变逻辑以从 jQuery 发出 AJAX 请求,如下所示:

$.ajax({
type: "POST",
url: window.location.href,
data: {
data1: data
},
success: function (result) { //success
},
failure: function (result) {
//failure
}
}).done(function (o) {
//Error free
});

通过这种请求,我无法访问 .cs 上的文本框数据(或复选框列表的选中项)。对 txtFirstName.Text 的任何调用都将返回为空。

UserControl ctl1 = placeholder.FindControl("user_control_1") as UserControl;
if (ctl1 != null)
{
RadTextBox txtName = ctl1 .FindControl("txtFirstName") as RadTextBox;
if (txtName != null)
{
// Works well till this point.
// txtName.Text returns empty value, inspite of having data in it
}
}

谁能提供有关我如何实现这一目标的指示?

编辑:由于在单击“保存”按钮时会生成一个新的 AJAX 请求,因此会再次加载所有用户控件,这会导致最终用户输入的所有数据丢失。在发出 AJAX 请求之前,我可以通过哪些方式捕获所有最终用户输入的数据?也许,在 jQuery 中为文本框和复选框列表创建一个 JSON,然后将其传递给“数据”?

4

1 回答 1

0

听起来您正在混合 jquery ajax 调用和网络表单,这很好。

为了将值发送回服务器端代码,您需要确保有问题的 HTML 控件设置为 runat="server"。这会将用户控件添加到视图状态。只要确保您添加了一个网络表单 UpdatePanel。如果不是,当您真正想要的只是部分回发时,您将获得完整的回发。您应该能够将“runat”属性添加到 DOM 中的任何“输入”控件。如果您仍然有问题或希望使用 ASP.NET 本机控件,您可以向页面添加隐藏控件并通过 javascript 设置它的值。

如果您想将所有内容都升级为现代设计,您可以一起禁用视图状态并调用 web 方法来发布您的数据,我建议使用 WebAPI,因为它比 WCF 更容易设置。这样做将消除使用 Ajax UpdatePanel 的需要并大大简化代码。

如果您使用 Telerik,那么您将使用 RadAjaxManager,而不是使用 UpdatePanel。

编辑: 对不起,我刚刚注意到您想从 Ajax 发布并通过视图状态将其发送到 WebForms 后端(我假设为 aspx.cs)。除非您发布表单数据,否则这将不起作用,这似乎是不必要的努力。

如果我是你,我会切换到 WebAPI。或者,如果您真的想保留该后端代码,我将使用 UpdatePanels,将值设置为具有 runat=true 的控件,使用某种隐藏按钮驱动部分回发,然后引用 runat 控件以提取值出去。

最后,如果你真的真的很想保留 jQuery Ajax 语句并且你真的不想通过添加 WebAPI 的工作,你可以切换到 ASMX 并将你的 ASMX web-method 添加到 aspx.cs 文件中。 ..虽然我建议不要这样做。

于 2020-04-25T14:09:58.780 回答