ASP.NET:在向页面添加控件时生成属性值

时间:2009-02-12 14:13:34

标签: c# asp.net user-controls controls custom-controls

上下文:ASP.NET 3.5 / C#

您好,

我创建了一个用户控件

public partial class MyControl : UserControl
{
    // EDIT: example first used "UniqueId" as property name, which was wrong.
    public Guid MyId { get; set; }
    // ...
}

和此示例用法

<uc1:MyControl 
    ID="myControl" 
    MyId="443CBF34-F75F-11DD-BE2F-68C555D89123"
    runat="server" />

步骤:

  • 将此控件添加到Web表单(aspx)

预期结果:

  • 添加了用户控件的HTML,MyId的唯一值(对应于Guid.NewGuid())在设计时在ASPX HTML中设置为MyId属性值。

实际结果:

  • 添加了用户控件的HTML,MyId属性值在设计时未在HTML中设置MyId的唯一值。

如果无法做到这一点:

  • 解决方法1:是否可以使用服务器控件实现此目的?怎么样?
  • 解决方法2:是否可以使用UserControl设计模式任务实现此目的?

澄清:

  • 持久保存属性值是一个问题,因为它永远不会更改为控件内容,并且由ASP.NET通过aspx页面中的控件声明自动设置。
  • MyId属性不需要在运行时呈现。

Gr B!

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

这里有几个问题,但首先我会回答你关于解决方法的问题。

  1. 不,您已经在使用服务器控件。
  2. 没有设计模式只是让开发人员的生活变得轻松,它不会影响其他任何事情
  3. 这里有两个问题。已经存在一个名为UniqueID的属性我不知道你是否试图超载,但问题不明确。第二个问题是您的UniqueID基本上没有存储在任何地方。请尝试以下代码:

    public Guid UniqueId {
        get { return (Guid)ViewState["MyUserControlUniqueId"]; }
        set { ViewState["MyUserControlUniqueId"] = value; }
    }
    

    这将把GUID存储在ViewState中,以便您可以在回发时检索它。

    更新:根据您的评论,您需要覆盖/使用此方法向呈现的内容添加属性。

    http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.addattributestorender.aspx

答案 2 :(得分:0)

如果我正确理解您的问题,您将在您的用户控件上公开名为MyId的属性。这允许您在放置该控件的任何位置设置属性。

您还想要的是,呈现的HTML也包含此属性和值。

如果是这种情况,MyId属性不会传递给HTML,这只是因为用户控件将MyId作为属性,它在设计器中可见。

在您的用户控件中,您将定义要呈现的标记。 例如,如果你有:

<asp:Panel runat="Server" Id="myControlDiv">Some other content</asp:Panel>

然后你可以在你的控件预渲染事件(或你选择的任何地方)放置

myControlDiv.Attributes.Add("MyId", SomeGuid.ToString())

然后将在HTML中输出

<div id="generatedID" MyID="443CBF34-F75F-11DD-BE2F-68C555D89123">Some other content</div>

答案 3 :(得分:0)

所以你只想要一个你只在设计时使用的唯一ID吗?

为什么不覆盖Object.GetHasCode();

然后将其作为财产曝光?