【问题标题】:Page_ClientValidate() object expected error, cant find the validatorPage_ClientValidate() 对象预期错误,找不到验证器
【发布时间】:2011-03-30 13:00:39
【问题描述】:

我有一个 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 生成一个控件。

提前致谢。

【问题讨论】:

  • 您是否尝试使用诸如 firebug 或 Web Developer 之类的浏览器工具来调试您的 js 代码,以查看它到底哪里出错了。
  • 是的,我做到了..他无法识别验证器..我不知道为什么..我还尝试在 SPFIeld 的控件上添加验证器,但没有解决方案..

标签: c# javascript asp.net sharepoint user-controls


【解决方案1】:

Sharepoint 有一个丑陋的怪癖,它可以将 Guid 分配为控件的 id。我已经看到由 Sharepoint 生成的 JavaScript 尝试使用这些 Guid 作为变量名。这不好 - 它会破坏脚本 - JavaScript 变量名中不允许使用破折号。我怀疑这是您遇到的问题。而且,我猜罪魁祸首是this.CreateFieldRenderingControl()。看起来该方法正在生成一个 Id ......那个 Id 是 Guid 吗?如果是这样,请尝试用安全的东西覆盖 Id,也许只是从 Guid 中删除破折号。

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

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

【讨论】:

    【解决方案2】:

    加载控件后,通过 Firebug 检查 ID 控件或仅查看 HTML 的源代码,因为某些控件在您放入其他控件时,其 ID 在呈现时会发生变化。 可以的话,把htmnl代码的代码也写一下。

    【讨论】:

    • 不,我对 id 没有任何问题 ..他们渲染得很好..这是我在 javascript function ValidateRenderedControl() { Page_ClientValidate(); 中的函数警报(Page_IsValid);警报总是返回 true..这意味着验证函数总是返回 true
    【解决方案3】:

    试试这个(将组名作为参数传递给 Page_ClientValidation 函数)

    Page_ClientValidation("group")
    

    【讨论】:

    • 我也试过这个:this.Page.Validators.Add(newValidator);
    【解决方案4】:

    试试这个:

    newValidator.ControlToValidate = fieldRenderingControl.ClientID;
    

    【讨论】:

    • 我收到此错误:无法验证“valideee”的 ControlToValidate 属性引用的控件“Field_4a4ab3a1-d5cc-4fbb-a212-ec5697827c75”
    【解决方案5】:

    代替 Page_ClientValidate(),使用:

    ValidatorValidate("id of field rendering control");
    

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

    【讨论】:

      【解决方案6】:

      也许这篇文章为时已晚......但这里有一些想法......
      有几种可能的情况:
      (1)验证器和要验证的控件在同一个面板中?验证完成时可能存在隐藏面板。
      (2) 如果你是动态创建的,这个创建是放在页面加载上的吗?如果是这样,是在第一次验证输入的函数中创建的吗?有可能没有必要这样做。
      (3) 使用protected override void CreateChildControls() 最终不会运行在所有重新加载的过程中,特别是如果某些控件的ViewState 发生变化。你可以把它放在页面加载中。
      (4) 其他替代方法是将按钮放置在面板内,但可见属性 = false 和验证器,启用属性 = false。当您运行该操作时,您更改这两个状态并且您可以使用 PostBack。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-27
        • 2011-08-24
        • 2018-05-15
        • 2017-04-21
        • 1970-01-01
        • 2018-03-23
        • 2010-11-01
        • 2012-07-21
        相关资源
        最近更新 更多