我要求在页面(或控件)顶部显示格式错误的错误消息。
因此我实现了新创建的服务器控件的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()。
有人解决这个问题吗?
答案 0 :(得分:3)
解决方案很简单:
只是不解析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
}
答案 1 :(得分:0)
也许你可以在ViewState中保存IsValid属性,并将其初始化为true。
在Load中,检查IsValid是否为null,如果不为null,则将ViewState中的IsValid设置为Page.IsValid中的值。
在Render中,从ViewState中读取IsValid。
答案 2 :(得分:0)
我可能会偏离此处,但你不能只是将控件的构造函数连接到页面的Validate事件吗?
如果需要,您可以拥有一个内部标志,渲染器会检查是否在渲染代码中执行下一步操作。
private bool _thePageIsBeingValidated = false;
public bool ShouldIDoMyThing
{
get{ return (_thePageIsBeingValidated && this.Enabled && this.Page.IsPostback && this.Page.IsValid != null && this.Page.IsValid == false); }
}