UpdatePanel不更新子div

时间:2014-11-06 00:25:19

标签: asp.net

我正在尝试验证文本框值更改时尚未使用用户名。在服务器端回调中,我添加了一个类,如果没有,则为has-success,如果有祖先div,则为has-error。这两个都包含在UpdatePanel中。

然而,尽管回调代码运行良好,但div的类永远不会在客户端更新。

标记

<asp:UpdatePanel runat="server" ChildrenAsTriggers="true">
    <ContentTemplate>
        <div id="divLoginFormGroup" runat="server" class="form-group has-feedback">
            ...
            <asp:TextBox ID="tbLogin" runat="server" class="form-control" placeholder="username" OnTextChanged="tbLogin_TextChanged" AutoPostBack="true" required />
            ...
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

服务器侧

private void AddClass(HtmlGenericControl control, string className)
{
    control.Attributes["class"] += " " + className;
}

private void RemoveClasses(HtmlGenericControl control, params string[] classNames)
{
    foreach (string c in classNames)
    {
        control.Attributes["class"] = control.Attributes["class"].Replace(c, string.Empty);
    }
}

protected void tbLogin_TextChanged(object sender, EventArgs e)
{
    using (SqlDataReader reader = new LoginData().GetLoginByID(tbLogin.Text))
    {
        if (reader.HasRows)
        {
            RemoveClasses(divLoginFormGroup, "has-success");
            AddClass(divLoginFormGroup, "has-error");
        }
        else
        {
            RemoveClasses(divLoginFormGroup, "has-error");
            AddClass(divLoginFormGroup, "has-success");
        }
    }
}

// Added per @sh1rts's answer, but I still have the same problem
protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation(tbLogin.UniqueID);
    base.Render(writer);
}

我在这里缺少什么?

如果有帮助,第一个OnTextChange会很好,但第二个总是会导致:

  

无效的回发或回调参数。使用配置或&lt;%@ Page EnableEventValidation =“true”%&gt;启用事件验证在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

1 个答案:

答案 0 :(得分:0)

您可以通过调用RegisterForEventValidation来避免此问题 - 请注意,您只能在页面的Render方法中执行此操作: -

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation(tbLogin.UniqueID);
    base.Render(writer);
}