У меня есть UserControl, который содержит TextBox и CustomValidator.
Я хотел бы установить CustomValidator.ServerValidate для метода на странице, которая содержит UserControl
Я нашел этот код, который позволит мне динамически устанавливать функцию проверки пользовательских валидаторов:
cusvCustom.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(MethodName);
Проблема в том, что строковое значение не будет работать там. Это должна быть ссылка на метод. Можно ли использовать отражение (или какой-либо другой метод), чтобы получить действительную ссылку на метод родительских элементов управления, используя только его строковое имя? Причина, по которой я хочу использовать строковое значение имени метода, заключается в том, что я могу разместить элемент управления на странице следующим образом:
<uc1:TextBoxField ID="tbUserName" runat="server" CustomValidationMethod="ValidateUserName" />
Я провел некоторые исследования и нашел Type.GetMethod и MethodInfo, но не могу заставить их работать. Прежде всего потому, что я не знаю тип родительского элемента управления и не могу понять, как его получить.
РЕДАКТИРОВАТЬ: мой код для Matt-Dot-Net
WebUserControl.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl.ascx.cs" Inherits="WebApplication1.WebUserControl" %>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Custom Validation Failed" OnServerValidate="CustomValidator1_ServerValidate" />
<asp:TextBox ID="TextBox1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Submit" CausesValidation="true" />
WebUsecControl.ascx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class WebUserControl : System.Web.UI.UserControl
{
public ServerValidateEventHandler Validating;
protected void CustomValidator1_ServerValidate(object sender, ServerValidateEventArgs e)
{
if (Validating != null)
Validating(sender, e);
}
}
}
TestPage.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="WebApplication1.TestPage" %>
<%@ Register Src="~/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:WebUserControl ID="WebUserControl1" runat="server" OnValidating="WebUserControl1_Validating" />
</div>
</form>
</body>
</html>
TestPage.aspx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class TestPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//WebUserControl1.Validating += WebUserControl1_Validating;
}
protected void WebUserControl1_Validating(Object sender, ServerValidateEventArgs e)
{
e.IsValid = false;
}
}
}
Как видите, это почти точная копия вашего кода. По какой-то причине это не работает для меня, как у меня здесь. Когда я нажимаю на кнопку, страница перезагружается и остается прежней. Когда я отменяю комментарий в одной строке и нажимаю кнопку, я вижу сообщение об ошибке.