如何将 HtmlGenericControl 转换为 WebControl?

Ros*_*ker 1 c# asp.net htmlgenericcontrol

...我正在尝试使用此代码(我通过我的结对编程朋友发现,他将被称为“G 先生”)动态地向我的 ASP 控件添加或删除类

public static class WebHelper
{
    public static void AddCssClass(this WebControl control, string cssClass) {
        List<string> classes;
        if (!string.IsNullOrWhiteSpace(control.CssClass)) 
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (!classes.Contains(cssClass))
                classes.Add(cssClass);
        }
        else
        {
            classes = new List<string> { cssClass };
        }
        control.CssClass = string.Join(" ", classes.ToArray());
    }

    public static void RemoveCssClass(this WebControl control, string cssClass)
    {
        List<string> classes = new List<string>();
        if (!string.IsNullOrWhiteSpace(control.CssClass))
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
        classes.Remove(cssClass);
        control.CssClass = string.Join(" ", classes.ToArray());
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我找不到将我的 HtmlGenericControls 传递给他们的方法......我已经尝试过显而易见的:

WebControl test1 = (WebControl)Page.FindControl("divcontent");
WebHelper.AddCssClass(test1, centredClass);
Run Code Online (Sandbox Code Playgroud)

但我得到: System.InvalidCastException: Unable to cast object of type 'System.Web.UI.HtmlControls.HtmlGenericControl' to type 'System.Web.UI.WebControls.WebControl'。

我在 C#、Visual Studio 等方面仍然相对缺乏经验,因为我的背景是 Ye Olde Pick BASIC,所以请简单解释一下我如何投射我的控制,或者修改代码,以便它能够实现能够添加或删除的最终目标类而不会丢失任何现有的类。

非常感谢!罗斯

wal*_*her 5

你错误地使用了你的朋友类。WebHelper 中的方法是扩展方法,因此它应该如下所示:

WebControl test1 = (WebControl)Page.FindControl("divcontent");
test1.AddCssClass("something");
Run Code Online (Sandbox Code Playgroud)

(验证它有效)。确保您的控件来自WebControl并已runat="server"设置。

编辑:修改 WebHelper 以支持 HtmlControls

public static class WebHelper
{
    public static void AddCssClass(this HtmlControl control, string cssClass)
    {
        List<string> classes;
        if (!string.IsNullOrWhiteSpace(control.Attributes["class"]))
        {
            classes = control.Attributes["class"].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (!classes.Contains(cssClass))
                classes.Add(cssClass);
        }
        else
        {
            classes = new List<string> { cssClass };
        }
        control.Attributes["class"] = string.Join(" ", classes.ToArray());
    }

    public static void RemoveCssClass(this HtmlControl control, string cssClass)
    {
        List<string> classes = new List<string>();
        if (!string.IsNullOrWhiteSpace(control.Attributes["class"]))
        {
            classes = control.Attributes["class"].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
        classes.Remove(cssClass);
        control.Attributes["class"] = string.Join(" ", classes.ToArray());
    }

    public static void AddCssClass(this WebControl control, string cssClass)
    {
        List<string> classes;
        if (!string.IsNullOrWhiteSpace(control.CssClass))
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (!classes.Contains(cssClass))
                classes.Add(cssClass);
        }
        else
        {
            classes = new List<string> { cssClass };
        }
        control.CssClass = string.Join(" ", classes.ToArray());
    }

    public static void RemoveCssClass(this WebControl control, string cssClass)
    {
        List<string> classes = new List<string>();
        if (!string.IsNullOrWhiteSpace(control.CssClass))
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
        classes.Remove(cssClass);
        control.CssClass = string.Join(" ", classes.ToArray());
    }
}
Run Code Online (Sandbox Code Playgroud)

根据需要随意修改代码。一切都保持不变,只是为HtmlControl添加了扩展方法,因为如果要修改HtmlControl的类,则需要使用control.Attributes["class"],因为没有CssClass属性。希望能帮助到你!