2014-01-28 214 views
1

我們有許多客戶可以在其網站上註冊的表單。這是可定製的,表單的所有者可以設置一個字段在窗體上顯示或隱藏,也是必需的。但是,如果顯示某些字段,則需要設置另一個字段以使表單有效。所以驗證可能會非常棘手。另一個棘手的部分是,我們希望所有的錯誤消息在驗證總結中一起顯示。如果我只是有我自己的函數被稱爲onclientclick linkbutton我不能添加它生成的任何錯誤消息到驗證摘要。客戶端驗證不起作用的自定義驗證器

所以我們最初找到的解決方案是在頁面上創建一個自定義驗證器,而不設置它的controltovalidate屬性,但將它的clientvalidationfunction設置爲我們想調用的函數。這允許我們設置發件人參數的錯誤消息,以便它隨後出現在驗證摘要中。

我們需要添加一些額外的驗證邏輯,當我這樣做時,我意識到頁面不再像以前那樣工作了(我認爲它在.net 2中工作,現在我們在.net 4上)。

這裏是我有的基本的html代碼。

網頁 -

<asp:ValidationSummary ID="vsummary" runat="server" HeaderText="Oops, it appears the following required fields are not completed." CssClass="error" /> 
<asp:CustomValidator ID="cstCustomScripts" runat="server" ClientValidationFunction="ValidateExtraFields" /> 
...additional form fields here 
<asp:LinkButton ID="btnAddUpdate" runat="server" onclick="SubmitProfile" /> 

和得到通過自定義驗證調用的JavaScript ...

function ValidateExtraFields(sender, args) { 
    args.IsValid = true; 

    if (typeof window.RelocationSelectionRequired == 'function') { 
     if (!RelocationSelectionRequired()){ 
      args.IsValid = false; 
      sender.errormessage = "If you are open to relocating, please select the state(s) and cities."; 
      return; 
     } 
    } 

    if (typeof window.ValidateHomeState == 'function') { 
     if (!ValidateHomeState()) { 
      args.IsValid = false; 
      sender.errormessage = "Home state is required."; 
      return; 
     } 
    } 

    if (typeof window.ValidateWorkState == 'function') { 
     if (!ValidateWorkState()) { 
      args.IsValid = false; 
      sender.errormessage = "Work state is required."; 
      return; 
     } 
    } 

    var invalidNumberField = ""; 
    $("[data-validate-function='GreaterThanZero']").each(function() { 
     var t = $(this); 
     if (t.val().trim() == "0") { 
      args.IsValid = false; 
      invalidNumberField = t.attr("controlName"); 
      return false; 
     } 
    }); 

    if (invalidNumberField.length > 0) { 
     sender.errormessage = invalidNumberField + " cannot be zero."; 
     return; 
    } 
} 

在過去的功能會成功追加任何消息,從這個功能在ValidationSummary控制並不提交表格。現在它仍然追加消息,但表單也不應該提交。有誰知道這是從.net 2轉移到.net 4的結果嗎?還是有其他原因,它不再有效?謝謝。

回答

0

您的鏈接按鈕應該有CauseValidation = true用於驗證被解僱。

+0

我從來沒有需要過。如果我在頁面上留下其他必填字段中的一個,驗證對他們來說工作正常 - 表單不提交。只是踢了我試了一下,但仍然在提交表單。 –

0

你說你相信這個工作在.net 2.0中。我找到了一個關於Breaking changes in ASP.NET 4的頁面。我沒有看到任何有關CustomValidator控件的具體內容,這將是一個突破性改變。但它提到了web.config中的設置,您可以使用try。它會將渲染兼容性版本降低到2.0或3.5。

<pages controlRenderingCompatibilityVersion="2.0" /> 

<pages controlRenderingCompatibilityVersion="3.5" /> 

如果不工作,你也可以嘗試降低Web項目的.NET版本2.0或3.5。

+0

謝謝。我嘗試了3.5標籤,但沒有改變。將其設置爲2.0只會導致錯誤,指出控件呈現兼容性版本不得低於3.5。不幸的是,我們的代碼中有太多的代碼是基於.net4的,我無法回滾。希望有另一種解決方案。 –

+0

有一件事你可以嘗試,如果你有你的代碼在源代碼控制下,我希望你能做到。然後在團隊資源管理器中使用「獲取特定版本」時,通過.net 2.0嘗試回到歷史記錄中。然後,你可以縮小它的範圍,並確定它是否因升級到4.0或其他因素而停止工作。 –

+0

謝謝,但我們的系統太大了,無法在一個表單上進行驗證。我基本上只是最終重寫了它的大部分,所以它現在正在工作。再次感謝。 –