使用以编程方式添加的验证器将超链接添加到ValidationSummary

时间:2018-10-16 04:14:00

标签: javascript jquery html asp.net validation

我正在我的项目中使用此问题答案中的javascript:

Adding Hyperlinks to ValidationSummary

它真的很棒。我已将其添加到我的主页的底部(由于某些原因,即使它位于$(document).ready中,如果我将其放在头部,Page_Validators也为空)

无论如何!我还使用以下代码在回发中以编程方式添加了一些自定义验证器:

public static CustomValidator ReturnErrorMessage(string message, string validationGroup, string controlToValidate = "")
    {
        CustomValidator control = new CustomValidator();

        control.ID = "cv" + controlToValidate;
        control.IsValid = false;
        control.Text = " ";
        control.ValidationGroup = validationGroup;
        control.ErrorMessage = message;
        control.ControlToValidate = controlToValidate;

        return control;
    }

但是,每当我添加这样的CustomValidator时,在按钮事件,page_load或其他事件中,Page_Validators都将被覆盖,并且错误消息将还原为没有锚点的消息。

有什么作用?我是在做错什么,还是有人可以解释正在发生的事情?

我已经尝试调试它,并且确实设置了正确的值,但是之后才重置。

我已经尝试过了,在$(document)中。准备好将所有验证器设置为isvalid = false,这也将被覆盖。

我正在使用asp.net 4.5非侵入式验证,但是如果我将其关闭则不会有所不同。

在创建验证器之后的某个时刻,使用Page.ClientScript.RegisterStartupScript在代码中添加javascript也不起作用。

如果我没有在代码中添加任何验证器,那么一切都会按预期进行。

我知道我可以手动添加锚标记,但这是更新现有验证器的大量工作,而不仅仅是扔掉一个小的脚本,因此我希望将其付诸实践。

您可以使用以下代码对此进行测试:

using System;
using System.Web.UI.WebControls;    

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        CustomValidator control = new CustomValidator();

        control.ID = "cv" + txtName.ClientID;
        control.IsValid = false;
        control.Text = " ";
        control.ValidationGroup = "errorGroup";
        control.ErrorMessage = "Error message";
        control.ControlToValidate = txtName.ClientID;

        Form.Controls.Add(control);
    }
}

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebForm1" %>

  <!DOCTYPE html>

  <html xmlns="http://www.w3.org/1999/xhtml">

  <head runat="server">
    <title></title>
    <script src="jquery-3.3.1.min.js"></script>
  </head>

  <body>
    <form id="form1" runat="server">
      <div>
        <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
        <asp:ValidationSummary ID="vsSummary" runat="server" ValidationGroup="errorGroup" ForeColor="Red" HeaderText="Error!" />
      </div>
    </form>
    <script>
      $(document).ready(function() {
        var validators = Page_Validators; // returns collection of validators on page

        $(validators).each(function() {
          //get target control and current error validation message from each validator
          //[0] is needed when using aspnet 4.5 unobtrusive validation
          var validator = $(this)[0];

          var errorMsg = validator.errormessage;
          var targetControl = validator.controltovalidate;

          //make link only if theres a control to target
          if (targetControl) {
            var errorMsgWithLink = "<a href='#" + targetControl + "' style='color: #FF3232;'> " + errorMsg + "</a>";

            //update error message with anchor tag
            validator.errormessage = errorMsgWithLink;
          }
        });
      });
    </script>
  </body>

  </html>

2 个答案:

答案 0 :(得分:0)

如果您愿意,可以按照Reference Source by Microsoft所述的相同设计模式来尝试实现自己的'CustomValidationSummary'控件,并在将其传递到之前,修改render方法以包括锚点标签来包装错误文本。第462行的writer方法。

答案 1 :(得分:0)

我最终使用扩展方法,在该方法中添加了定位标记

public class Mainactivity extends NavActivity
{
super.onCreate(savedInstanceState);
   LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   //inflate your activity layout here!
   View contentView = inflater.inflate(R.layout.activity_main, null, false);
   drawer.addView(contentView, 0);
}