我需要在页面(或控件)的顶部显示一个格式良好的错误消息。
因此,我实现了新创建的服务器控件的render方法。新创建的控件继承自ValidationSummary。
public class AgValidationSummary : ValidationSummary
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
if(this.Enabled)
{
if (Page.IsPostBack && !Page.IsValid)
{我现在的问题是,如果触发了一个按钮,并且它的属性CausesValidation被设置为false,那么我的validationsummary将抛出一个异常,因为我询问了Page.IsValid属性(并且只有在调用了Page.validate()时才会设置该属性。
有人有解决这个问题的办法吗?
发布于 2009-06-12 05:24:04
解决方案在某种程度上很简单:
不要解析Page.IsValid标志:),而是在您的void Render(HtmlTextWriter writer)中执行类似的操作
if (!this.Enabled)
{
return;
}
if (this.Page != null)
{
this.Page.VerifyRenderingInServerForm(this);
}
else
{
return;
}
var failedValidators = this.Page.Validators.OfType<BaseValidator>().Where(bv => string.Equals(bv.ValidationGroup, this.ValidationGroup) && !bv.IsValid).ToList();
if (failedValidators.Any())
{
writer.Write(this.HeaderText);
foreach (var failedValidator in failedValidators)
{
writer.Write(failedValidator.ErrorMessage);
}
}这样做的原因是:
导致回发的控件已获得有关
因此,ASP.net引擎本身将执行相关的验证器,并将它们设置为IsValid或不设置它们。
编辑
要删除原始HeaderText (仍在渲染),请执行以下操作:
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
// overwrite to hide the original HeaderText
}发布于 2009-03-24 08:19:40
也许您可以在ViewState中保存IsValid属性,并将其初始化为true。
在Load中,检查IsValid是否为null,如果不为null,则将ViewState中的IsValid设置为Page.IsValid中的值。
在Render中,从ViewState读取IsValid。
发布于 2009-03-24 11:50:06
我可能在这里偏离了正轨,但是您就不能在控件的构造函数中连接到页面的Validate事件吗?
如果需要,您可以有一个内部标志,渲染检查以查看是否在渲染代码中执行下一步发生的操作。
private bool _thePageIsBeingValidated = false;
public bool ShouldIDoMyThing
{
get{ return (_thePageIsBeingValidated && this.Enabled && this.Page.IsPostback && this.Page.IsValid != null && this.Page.IsValid == false); }
}https://stackoverflow.com/questions/676489
复制相似问题