当前位置: 代码迷 >> JavaScript >> Page_ClientValidate()对象预期错误,无法找到验证器
  详细解决方案

Page_ClientValidate()对象预期错误,无法找到验证器

热度:103   发布时间:2023-06-05 14:16:22.0

我有一个表单HomePage.aspx包含一个空的asp:Panel,一个下拉列表,让用户选择一个SPFielType ...索引更改,我的HomePage.aspx.cs页面将获得选中的文本,并将在面板中加载用户控件,这个用户控件将根据用户选择的spfieldtype和一个调用validateForm()函数的按钮生成一个控件...我的问题是validateForm()中的Page_ClientValidate()函数找不到验证器,我也尝试过给一个组名,但仍然没有工作。
当我将按钮放入我的aspx页面(不动态渲染)时,它正在验证我的页面。( <asp:Button ID="submitbutton" Text="Validate" runat="server" /> )。
但是当我动态渲染它时,无法验证表单。这就是我想要做的:

protected override void CreateChildControls()
{
    try
    {
        fieldRenderingControl = this.CreateFieldRenderingControl(this.FieldType);
        this.Controls.Add(fieldRenderingControl);

        Button button = new Button();
        button.UseSubmitBehavior = false;
        button.Text = "ValidateButton";
        button.ID = "ValidateButton";
        button.OnClientClick = "validateForm()";
        this.Controls.Add(button);

        RequiredFieldValidator newValidator = new RequiredFieldValidator();
        newValidator.Text = "***";
        newValidator.ID = "valideee";
        newValidator.EnableClientScript = true;
        newValidator.Enabled = true;
        newValidator.SetFocusOnError = true;
        newValidator.Display = ValidatorDisplay.Dynamic;
        newValidator.ControlToValidate = fieldRenderingControl.ID;
        this.Controls.Add(newValidator);

    }
    catch (Exception ex)
    {
    }

}

// CreateFieldRenderingControl()函数将根据用户选择的参数fieldType生成控件。

提前致谢。

Sharepoint有一个丑陋的怪癖,它可以指定一个Guid作为控件的id。 我见过Sharepoint生成的JavaScript试图将这些Guids用作变量名。 这不是好事 - 它会破坏脚本 - JavaScript变量名称中不允许使用破折号。 我怀疑这是你遇到的问题。 而且,我猜罪魁祸首就是this.CreateFieldRenderingControl() 看起来这个方法正在生成一个Id ...是一个ID Guid? 如果是这样,尝试用安全的东西覆盖Id,或者只是从Guid中删除破折号。

fieldRenderingControl.ID.Replace("-", "");

如果这不是确切的解决方案,希望它足以让你指向正确的方向。

加载控件后,请检查ID控件By Firebug或仅查看HTML的来源,因为当您放入其他控件时,某些控件会在渲染时更改其ID。 如果可以的话,也可以编写htmnl代码的代码。

试试这个(在Page_ClientValidation函数中传递组名作为参数)

Page_ClientValidation("group")

试试这个:

newValidator.ControlToValidate = fieldRenderingControl.ClientID;

而不是Page_ClientValidate(),使用:

ValidatorValidate("id of field rendering control");

但是,在您的一个回复中,此ID是“Field_4a4ab3a1-d5cc-4fbb-a212-ec5697827c75”,这不是有效的客户端ID。 连字符不能使用。 首先,确保客户端中的有效ID。

也许这篇文章太晚了......但这里有一些想法......
有几种可能的东西:
(1)验证器和要验证的控件是否在同一个面板中? 在验证完成时,可能存在隐藏的面板。
(2)如果你是动态创建的,那么这个创建是否放在了Page Load上? 如果是这样,是在第一次验证输入的函数中创建的? 可能没有必要这样做。
(3)使用受保护的覆盖void CreateChildControls()最终不会在所有重新加载过程中运行,特别是如果ViewState在某些控件中发生更改。 您可以将它放在页面加载中。
(4)其他替代方法是将按钮放在Panel中,但是visible属性= false以及验证器,属性enabled = false。 当您运行该操作时,您可以更改这两个状态,并且可以使用PostBack。