2010-06-04 57 views
1

我写了一个自定义的ASP.net控件,该控件从LinkBut​​ton下降并覆盖Render()方法。我正在使用它来替换正在处理的网站中的ImageButton,因此我们不必为每个按钮都有一个图像。自定义控件不会触发验证

该控制工作正常,是否需要后发等,但它不启动验证组中的验证器。这显然是一个问题。

该控件的代码是(浓缩)如下:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public class CustomButton : LinkButton 
{ 
    public string SpanCssClass { get; set; } 
    protected override void Render(HtmlTextWriter writer) 
    { 
     if (!Visible) 
     { 
      return; 
     } 

     writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID); 
     writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID); 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClass); 
     string postback = string.IsNullOrEmpty(OnClientClick) ? "javascript:__doPostBack('" + UniqueID + "','');" : OnClientClick; 
     writer.AddAttribute(HtmlTextWriterAttribute.Href, postback); 
     writer.RenderBeginTag(HtmlTextWriterTag.A); 

     writer.AddAttribute(HtmlTextWriterAttribute.Class, SpanCssClass); 
     writer.RenderBeginTag(HtmlTextWriterTag.Span); 

     writer.Write(Text); 

     writer.RenderEndTag(); 
     writer.RenderEndTag(); 
    } 
} 

有谁知道为什么会不会导致验证火?

我的印象是,将LinkBut​​ton中的所有其他方法置于未覆盖状态将使所有其他功能保持不变!

回答

1

问题是你正在生成自己的脚本,允许asp.net为你做,它应该更好地工作。像这样的东西会更好。

PostBackOptions options = new PostBackOptions(this); 
options.PerformValidation = true; 
options.RequiresJavaScriptProtocol = true; 

string postback = string.IsNullOrEmpty(OnClientClick) ? this.Page.ClientScript.GetPostBackEventReference(options) : OnClientClick; 
+0

几乎正确。您错过了您需要将ValidationGroup属性添加到选项,否则,很好地播放! – 2010-06-29 10:32:24

0

那么,如果你想手动触发验证如果CausesValidation为true,你可以调用Page_Validate客户端方法来触发验证。我认为需要一个参数,验证组来验证...

HTH。

+0

不,我希望它是自动的:所有我做的是改变渲染方法来添加锚点的跨度,所以我们可以不必尽可能多的代码风格他们,当然,它应该是微不足道的有验证器会像基础LinkBut​​ton一样激发? – 2010-06-04 11:48:13

+0

那么,你想获得.NET Reflector并在框架中查看发生了什么;实际上需要处理这种情况更复杂......因为默认渲染逻辑不起作用,所以您必须重新添加它们。LinkBut​​ton使用GetPostBackOptions方法返回一组选项(以生成HREF ),然后将这些添加到AddAttributesToRender方法中的HREF属性(您可以将其放入渲染中)。 HTH。 – 2010-06-04 12:10:28