繁体   English   中英

如何在ASP.NET网站中使用自定义控件?

[英]How to get a custom control available for use in an ASP.NET Website?

我有一个ASP.NET网站 ,而不是Web应用程序,我已经构建了一个自定义的CompareValidator ,它能够超出它自己的命名容器:

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

public class GlobalCompareValidator : CompareValidator
{
    new protected void CheckControlValidationProperty(string name, string propertyName)
    {
        Control control = this.Page.NamingContainer.FindControl(name);
        if (control == null)
        {
            throw new HttpException("Validator_control_not_found");
        }
        if (BaseValidator.GetValidationProperty(control) == null)
        {
            throw new HttpException("Validator_bad_control_type");
        }
    }
}

并且该代码存在于App_Code目录中。 现在,我想在ASCX页面上使用这个新的自定义控件,如下所示:

<me:GlobalCompareValidator ID="compareValidator" CssClass="errorMessage" Display="None"
    EnableClientScript="false" Text="&nbsp;" ValidationGroup="LHError" runat="server" />

但是,在尝试注册程序集以使用它时:

<%@ Register TagPrefix="me" Namespace="MyNamespace" Assembly="MyAssembly" %>

我收到此错误:

无法加载文件或程序集“...”或其依赖项之一。 该系统找不到指定的文件。

现在,这并不是那么令人惊讶,因为ASP.NET网站并没有真正生成这样的程序集。 但是,如果我将Assembly标记关闭,则无法找到GlobalCompareValidator 当然,它可能无法使用Assembly标签找到它,但是该错误很可能被它无法找到程序集的事实所隐藏。

我在世界上如何获得可在ASP.NET网站中使用的自定义控件?

您可以将Register指令用于两个目的:

  1. 包括UserControl
  2. 包括自定义控件

只有在包含UserControl时才需要SRC属性。 在您的情况下,您使用的是自定义控件,因此您只需要Namespace和Assembly-attributes。

您可以查看此MSDN页面以获取更多信息:

http://msdn.microsoft.com/en-us/library/c76dd5k1(v=vs.71).aspx

好吧,这个问题的解决方案很复杂,但现在就这样了。 首先,在花费大量时间尝试使自定义控件工作之后,我决定改变我对问题的思考方式。 我说:

如果我能在正确的命名容器中获得控件怎么办?

看起来很直接! 在运行时,我们将从用户控件中删除控件并将其添加到用户控件的父级。 但是,这比看起来更复杂。 您更改了在InitLoad修改Controls集合,因此这个想法有点问题。 但是,唉,Stack Overflow 通过这里的答案来解救! 因此,我将以下代码添加到用户控件:

protected void Page_Init(object sender, EventArgs e)
{
    this.Page.Init += PageInit;
}

protected void PageInit(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(this.ControlToCompare))
    {
        this.Controls.Remove(this.compareValidator);
        this.Parent.Controls.Add(this.compareValidator);
    }
}

你在这里有一个页面生命周期中的一点漏洞。 虽然我无法在InitLoad修改Controls集合,但我可以在这两个事件之间进行修改! 谢谢蒂姆!

这完成了任务,因为我能够在运行时将CompareValidator移动到正确的命名容器,以便它可以找到它正在验证的用户控件。

注意:您还必须将ValidationProperty属性添加到要将值与之比较的用户控件上。 我是这样做的:

[ValidationProperty("Value")]

然后当然有一个名为Value的属性暴露在该用户控件上。 在我的情况下,该属性继续使用我为CompareValidator修改的相同用户控件,因为我正在比较来自同一用户控件的两个值。

我希望这有助于某人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM