【问题标题】:ASP.NET: generate property value when adding control to pageASP.NET:向页面添加控件时生成属性值
【发布时间】:2010-10-07 04:25:38
【问题描述】:

上下文: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,在设计时未在 HTML 中为 MyId 属性值设置唯一的 MyId 值。

如果这是不可能的:

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

澄清:

  • 保持属性值不是问题,因为它不会因控件实例而改变,并且由 ASP.NET 通过 aspx 页面中的控件声明自动设置。
  • MyId 属性不需要在运行时呈现。

Gr B!

【问题讨论】:

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


    【解决方案1】:
    【解决方案2】:

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

    1. 不,您已经在使用服务器控件。
    2. 没有设计模式只是为了让开发人员的生活变得轻松,它不会影响其他任何事情

    这里有两个问题。已经有一个名为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

    【讨论】:

    • 嗨尼克,我已将示例代码的原始属性重命名为 UniqueId,我无意覆盖 UniqueId。 ViewState 不是我的问题,目标是让新的 GUID 出现在生成的 HTML 中。
    • 感谢您的更新,我还不够清楚。我的目标是每次页面设计器将控件拖到网页时,在 ASPX 设计时 HTML 中都有不同的 GUID。该属性不需要添加到呈现的 HTML 中。
    【解决方案3】:

    如果我正确理解您的问题,您将在您的用户控件上公开一个名为 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>
    

    【讨论】:

    • tnx 为您的回复。 “你还想要的是,渲染的 HTML 也包含这个属性和值。”我明白你为什么现在会有这种印象,但这不是我的本意。 HTML是指aspx中的设计时HTML。
    【解决方案4】:

    所以您只想生成一个仅在设计时使用的唯一 ID?

    为什么不重写 Object.GetHasCode();

    然后将其作为财产公开?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      相关资源
      最近更新 更多