【问题标题】:ASP Web Forms Removing Class Client-Side from ViewStateASP Web 窗体从 ViewState 中删除类客户端
【发布时间】:2016-04-28 00:54:14
【问题描述】:

我正在尝试确定从元素客户端删除类并在 ViewState 中维护该删除的正确方法。例如,我有一个带有自定义验证器的表单。自定义验证器将确定一个或多个字段的输入无效。然后它将向元素添加一个 css 类,使其显示为红色:

TextBox_UserName.CssClass += " error";

在客户端,我有一个 onkeyup 函数,它将删除该类,以便当用户开始在字段中输入时,它会恢复为默认样式:

<asp:TextBox ID="TextBox_UserName" runat="server" onkeyup="clearError(event, this)" />

Javascript 函数非常简单:

function clearError(event, elem) {
    if (event.keyCode != 9 && event.keyCode != 16 && event.keyCode != 13)
        $(elem).removeClass('error');
}

这很好用,但我遇到的问题是这个;假设用户输入了一个清除错误类的值,然后他们更改了导致回发的表单上另一个控件的值,当表单在回发后重新加载时,错误类又回到 TextBox_UserName 控件上。我假设发生这种情况是因为该类是通过代码隐藏添加的,因此保存在 ViewState 中。

有没有一种方法可以在客户端删除或更新元素的类并将该更改反映在 ViewState 中?

我唯一能想到的就是在代码隐藏中添加逻辑来处理这个问题,但是我正在使用的表单有很多字段,所以这并不理想。我想的另一个选择是使用telerik AjaxManager,这样只有导致回发的字段才会受到回发的影响,但这也不是很理想。我希望有一种更好或更有效的方法来完成我尝试使用 javascript 完成的工作。我没有找到解决方案的运气,因为我发现的所有内容都在谈论更改 ViewState 将如何导致错误(我也不想删除它)。

编辑:我选择了这个解决方案:

在我的自定义验证器方法中,我从所有可能受到影响的控件中清除了错误类。然后我检查每个字段是否有效,然后将错误类添加到我检查失败的字段中。然后我更新隐藏字段的值以指示表单上已发生验证。

在处理触发回发的控件事件的方法中,我检查是否发生了验证,如果发生了,我会调用:

Page.Validate();

这将再次触发我的自定义验证器,因为它会首先清除错误类,它会更新用户尚未修复的字段的 css 类,同时保留固定的字段。

【问题讨论】:

  • 退后一步,重新思考你在做什么。您正在使用验证器,但您正在干扰他们的工作流程。也许有一种方法可以“正确”使用它们,因此不必编写额外的代码来保持工作。
  • 感谢您的意见。我不确定你的意思。我只是尝试设置验证失败的元素的样式,同时允许用户修复问题,然后清除指示存在问题的样式,同时在 ViewState 中保持该样式,以便将来的回发不会导致错误风格回来。您能否详细说明我是如何干扰验证者的工作流程的,以便我可以更好地理解这将使我能够提出更好的解决方案?我已经编辑了我的问题以解释我是如何解决它的,但也许这不是最好的方法。
  • 这就是我的意思。验证器应该负责样式。当您开始“干预”时,您就离开了他们的预期工作方式。通常,为了安全起见,我会为自定义验证器编写客户端验证代码。那你应该没事。

标签: javascript asp.net


【解决方案1】:

确实不能在客户端更改视图状态。将所有导致帖子的控件放回更新面板怎么样?这样,在回发期间只有那些控件会受到影响。就我个人而言,我更喜欢在 jQuery 中使用 AJAX 函数进行部分回传,因为它的重量要轻得多。但由于您使用的是 Web 表单,如果您不熟悉 jQuery AJAX,更新面板将是一个快速的解决方案。

另一种选择是将文本框的状态保存在隐藏字段中。然后服务器代码将知道将哪个类应用于文本框。

【讨论】:

  • 这些都是很好的解决方案。我想避免在 UpdatePanels/AjaxPanels 中包装单个控件(我正在从事的项目使用 Telerik 控件)。这样做的主要原因是因为整个表单已经包装在 AjaxPanel 中,所以我不想分解它。我选择使用隐藏字段,但方式与您的建议不同,因为我认为它需要的更改更少。我已经编辑了我的问题来解释我做了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2012-02-26
  • 2021-01-24
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多