繁体   English   中英

服务器端RequiredFieldValidators无法正常工作

[英]Server-side RequiredFieldValidators not working

我有一个代表调查的表格,该表格是根据某些数据库配置动态生成的。 我有一个用于呈现调查的自定义服务器控件( SurveyRenderer ),其中包含用于呈现问题的自定义服务器控件( QuestionRenderers )。 如果问题被标记为RequiredFieldValidators ,我会动态添加RequiredFieldValidators来提问。 我将这些验证器添加到SurveyRenderer的控件集合中。

代码要点...

// In SurveyRenderer.CreateChildControls()...
foreach (QuestionRenderer questionRenderer in questionRenderers)
{
   if (questionRenderer.Question.IsRequired)
   {
       Controls.Add(CreateRequiredValidator(questionRenderer));
   }
}

客户端验证工作正常-如果有人省略了必填问题,验证程序将捕获该问题,并且表单将不进行验证。 但是,如果我关闭JavaScript并提交了无效的表单,则验证程序似乎无法正常工作。

在服务器端,我正在调用Page.Validate()并在“提交”按钮单击事件处理程序中检查Page.IsValid 尽管提交了表单,但在服务器端Page.IsValid保留了必填问题(在客户端可能会遇到Page.IsValid留为True

// In SurveyPage.aspx...
public void btnSubmit_Click(object sender, EventArgs e)
{
   Page.Validate();
   if (Page.IsValid)
   {
       // Always get here, even though the form is not valid and would
       // have been caught client-side...
   }
}

我应该将验证器而不是SurveyRenderer添加到Page的Control集合中吗? 它如何在客户端而非服务器端工作?

更新 :我的QuestionRenderer带有以下注释:

[ValidationProperty("IsValid")]

IsValid的get方法如下所示:

// QuestionRenderer.IsValid
public bool IsValid
{
    get
    {
        EnsureChildControls();
        if (Question.IsRequired && QuestionIsNotAnswered())
        {
            return false;
        }

        return true;
    }
}

如果设置断点并逐步执行,则可以看到QuestionRenderer.IsValid被解雇了。 它应该做的时候返回false 如果我细粒度并调用btn_submitClick:

// In SurveyPage.aspx...
public void btnSubmit_Click(object sender, EventArgs e)
{
    foreach (IValidator validator in Page.Validators)
    {
        validator.Validate();  // this calls through to QuestionRenderer.IsValid, which returns false...
        bool valIsValid = validator.IsValid; // yet this is set to True
    }
}

因此,validator.IsValid为true,即使对QuestionRenderer.IsValid的调用返回false。 所以也许我没有正确地接线? 使用[ValidationProperty("IsValid")]还不够吗?

实际上,验证使用Page.Validators存储所有验证器的位置(实际例程有些棘手)-因此,将它们添加到何处都没有关系。

BaseValidator来源

protected internal override void OnInit(EventArgs e)
{
    base.OnInit(e);
    this.Page.Validators.Add(this);
}

我将它们保留在视图中,因为您可以使用object sender -parameter(代表验证器)来获取关联的控件...

我相信,你CreateChildControls -这也验证程序的安装-被调用来晚了,所以它忽略了验证阶段......你能也许尝试调用EnsureChildControlsOnLoad -event,看它是否改变了什么? 另一个机会可能是您的验证器不可见或被禁用...

编辑

根据您的编辑,我鼓励您使用CustomValidator - RequiredFieldValidator将在每种情况下返回true (属性为truefalse ,因为它不为空:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM