2014-01-28 51 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

谢谢,但我们的系统太大了,无法在一个表单上进行验证。我基本上只是最终重写了它的大部分,所以它现在正在工作。再次感谢。 –