我正在我的项目中使用此问题答案中的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>
答案 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);
}