C# Webusercontrol由于其保护级别而不可访问

C# Webusercontrol由于其保护级别而不可访问,c#,asp.net,webusercontrol,C#,Asp.net,Webusercontrol,我已经检查了其他SO线程,但没有太多的意义。此控件正在另一个webusercontrol中使用。每当我尝试用它做任何事情时,它就会抛出这个错误。所讨论的课程是: Compiler Error Message: CS0122: 'Controls_Arcade_StarDisplay.Stars' is inaccessible due to its protection level 代码隐藏: <%@ Control Language="C#" AutoEventWireup="tr

我已经检查了其他SO线程,但没有太多的意义。此控件正在另一个webusercontrol中使用。每当我尝试用它做任何事情时,它就会抛出这个错误。所讨论的课程是:

Compiler Error Message: CS0122: 'Controls_Arcade_StarDisplay.Stars' is inaccessible due to its protection level

代码隐藏:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="StarDisplay.ascx.cs" Inherits="Controls_Arcade_StarDisplay" %>
<asp:Panel runat="server" ID="Stars" />
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用System.Runtime.CompilerServices;
公共部分类控件\u Arcade\u StarDisplay:System.Web.UI.UserControl
{
公共双重评级{get;set;}
公共字符串工具提示{get;set;}
受保护的无效页面加载(对象发送方、事件参数e)
{
字符串CSSClass=“星级s-”;
如果(额定值<0.25)
CSSClass+=“0”;
否则,如果(额定值<0.75)
CSSClass+=“05”;
否则,如果(额定值<1.25)
CSSClass+=“1”;
否则,如果(额定值<1.75)
CSSClass+=“15”;
否则,如果(额定值<2.25)
CSSClass+=“2”;
否则,如果(额定值<2.75)
CSSClass+=“25”;
否则,如果(额定值<3.25)
CSSClass+=“3”;
否则,如果(额定值<3.75)
CSSClass+=“35”;
否则,如果(额定值<4.25)
CSSClass+=“4”;
否则,如果(额定值<4.75)
CSSClass+=“4”;
否则,如果(额定值<1.25)
CSSClass+=“1”;
否则,如果(额定值<4.75)
CSSClass+=“45”;
其他的
CSSClass+=“5”;
Stars.CssClass=CssClass;
如果(工具提示!=null)
Stars.ToolTip=工具提示;
}
}
控件已在web.config中注册:

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

public partial class Controls_Arcade_StarDisplay : System.Web.UI.UserControl
{
    public double Rating { get; set; }
    public string Tooltip { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        string CSSClass = "star-rating s-";
        if (Rating < 0.25)
            CSSClass += "0";
        else if (Rating < 0.75)
            CSSClass += "05";
        else if (Rating < 1.25)
            CSSClass += "1";
        else if (Rating < 1.75)
            CSSClass += "15";
        else if (Rating < 2.25)
            CSSClass += "2";
        else if (Rating < 2.75)
            CSSClass += "25";
        else if (Rating < 3.25)
            CSSClass += "3";
        else if (Rating < 3.75)
            CSSClass += "35";
        else if (Rating < 4.25)
            CSSClass += "4";
        else if (Rating < 4.75)
            CSSClass += "4";
        else if (Rating < 1.25)
            CSSClass += "1";
        else if (Rating < 4.75)
            CSSClass += "45";
        else
            CSSClass += "5";
        Stars.CssClass = CSSClass;

        if (Tooltip != null)
            Stars.ToolTip = Tooltip;
    }
}

开始显示控件出现在游戏概览控件内


谢谢你的帮助,完全卡住了!其他问题涉及获取我不了解的控件的属性,或者在设计器中更改我也找不到的内容。

这意味着您的用户控件中有一个名为
Stars
的东西,它可能被定义为
private
protected

问题在于,这是一个网站而不是Web应用程序,在网站中,.Net会自动将
runat=“server”
控件创建为
受保护的
属性,因此它们不能在用户控件或其直接继承者之外公开

因此,有两种可能的选择:

  • 将网站转换为web应用程序。这将导致创建包含控件定义的设计器文件。然后,您可以将控件从设计器文件中取出,将其放在codebehind中,并将访问级别更改为public

  • 由于这是一个可以从其他控件访问的控件,因此与直接公开该控件相比,更好的设计是提供其他控件可以使用的交互方法,以便在该控件中封装行为。例如,公开一个
    SetRating
    方法,该方法接受评级并在内部更新
    Stars
    面板


  • 从设计的角度来看,选项2绝对是一个更好的选项。

    这意味着您的用户控件中有一个名为
    Stars
    的东西,它可能被定义为
    private
    protected

    问题在于,这是一个网站而不是Web应用程序,在网站中,.Net会自动将
    runat=“server”
    控件创建为
    受保护的
    属性,因此它们不能在用户控件或其直接继承者之外公开

    因此,有两种可能的选择:

  • 将网站转换为web应用程序。这将导致创建包含控件定义的设计器文件。然后,您可以将控件从设计器文件中取出,将其放在codebehind中,并将访问级别更改为public

  • 由于这是一个可以从其他控件访问的控件,因此与直接公开该控件相比,更好的设计是提供其他控件可以使用的交互方法,以便在该控件中封装行为。例如,公开一个
    SetRating
    方法,该方法接受评级并在内部更新
    Stars
    面板


  • 从设计角度来看,选项2绝对是一个更好的选项。

    我的控件出现了相同的错误消息。我检查了我的代码文件,答案变得显而易见。该过程被定义为
    void Register\u Submit()
    。我在其定义中添加了
    public
    ,因此它变成了
    public void Register\u Submit()
    ,错误消失了。

    我的控件也收到了相同的错误消息。我检查了我的代码文件,答案变得显而易见。该过程被定义为
    void Register\u Submit()
    。我在它的定义中添加了
    public
    ,因此它变成了
    public void Register\u Submit()
    ,错误就消失了。

    我发布了整个类,将
    protected void Page\u Load
    更改为
    public void Page\u Load
    会引发相同的错误设计器文件中的星号声明是什么样子的?抱歉,我以前从未真正使用过设计器,设计器文件位于何处?我认为它是默认为protected生成的。为了避免这种情况,我通常会在常规代码隐藏(而不是设计器)中公开公共属性或方法,并以这种方式共享控件。这可能是一个选项,也可能不是一个选项,取决于您的情况。有两种方法可以达到此目的:1)右键单击页面并选择查看代码Gen文件;2) 显示项目中的所有文件,然后展开页面;你将看到它和你的代码隐藏。我发布了整个类,将
    受保护的无效页面加载
    更改为
    公共无效页面加载
    抛出了相同的错误星星声明是什么样子的
        <pages validateRequest="false" smartNavigation="false" clientIDMode="Static">
            <controls>
                <add tagPrefix="Scirra" src="~/Controls/Arcade/GameOverview.ascx" tagName="GameOverview"/>
                <add tagPrefix="Scirra" src="~/Controls/Arcade/Stars/StarDisplay.ascx" tagName="StarDisplay"/>
            </controls>
        </pages>