我有一个表单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生成控件。
提前感谢。
答案 0 :(得分:3)
Sharepoint有一个丑陋的怪癖,它可以指定一个Guid作为控件的id。我见过Sharepoint生成的JavaScript试图将这些Guids用作变量名。这不是好事 - 它会破坏脚本 - JavaScript变量名称中不允许使用破折号。我怀疑这是你遇到的问题。而且,我猜罪魁祸首是this.CreateFieldRenderingControl()
。看起来这个方法正在生成一个Id ...是一个ID Guid?如果是这样,尝试用安全的东西覆盖Id,或者只是从Guid中删除破折号。
fieldRenderingControl.ID.Replace("-", "");
如果这不是确切的解决方案,希望这足以让你指出正确的方向。
答案 1 :(得分:0)
加载控件后,请检查ID控件By Firebug或仅查看HTML的来源,因为当您放入其他控件时,某些控件会在渲染时更改其ID。 如果可以,也可以编写htmnl代码的代码。
答案 2 :(得分:0)
试试这个(在Page_ClientValidation函数中传递组名作为参数)
Page_ClientValidation("group")
答案 3 :(得分:0)
试试这个:
newValidator.ControlToValidate = fieldRenderingControl.ClientID;
答案 4 :(得分:0)
使用:
而不是Page_ClientValidate()ValidatorValidate("id of field rendering control");
但是,在你的一个回复中,这个id是“Field_4a4ab3a1-d5cc-4fbb-a212-ec5697827c75”,这不是一个有效的客户端ID。连字符不能使用。首先,确保客户端中的有效ID。
答案 5 :(得分:0)
也许这篇文章太晚了......但这里有一些想法......
有几种可能的事情:
(1)验证器和要验证的控件是否在同一个面板中?在验证完成时,可能存在隐藏的面板
(2)如果你是动态创建的,那么这个创建是否放在了Page Load上?如果是这样,是在第一次验证输入的函数中创建的?可能没有必要这样做
(3)使用受保护的覆盖void CreateChildControls()最终不会在所有重新加载过程中运行,特别是如果ViewState在某些控件中发生更改。您可以将它放在页面加载中
(4)其他替代方法是将按钮放在Panel中,但是visible属性= false以及验证器,属性enabled = false。当您运行该操作时,您可以更改这两个状态,并且可以使用PostBack。