簡體   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