【问题标题】:Custom controls on one page, populating the controls issue一页上的自定义控件,填充控件问题
【发布时间】:2011-08-19 15:49:17
【问题描述】:

这个问题是我之前发布的两个问题的延续:

1) How to get variables from .ascx in another .ascx?

2) C# asp.net textbox.text not setting?

我的第三个问题是,当我创建一个会话并通过从 ParentControl 到 ChildControl 解析信息,然后尝试将不同的信息解析到 ChildControl 的不同实例时,它会将值从第二个子控件复制到第一个子控件.

更新:显示我错过的 .ascx 页面可能是相关的。

父控件.ascx

<asp:PlaceHolder runat="server" id="ShowHideControls" Visible="false">    
    <asp:PlaceHolder runat="server" id="instanceOne" Visible="false">
        <uc1:ChildControl ID="controlOne" runat="server" />
    </asp:PlaceHolder>        
    <asp:PlaceHolder runat="server" id="instanceTwo" Visible="false">
        <uc1:ChildControl ID="controlTwo" runat="server" />
    </asp:PlaceHolder>
</asp:PlaceHolder>

ParentControl.ascx.cs

public void CreateSessionsAddressString(User user)
{
    if (user == user)
        Session["user"] = user;
}

instanceOne ChildControl.ascx.cs

public void SetUserDetails()
{   
    User user = Session["user"] as User;
    string fullAddress = User.fullAddress;
}

现在,如果我有同一个用户控件的第二个实例,则重复使用以下代码。

instanceTwo ChildControl.ascx

public void SetUserDetails()
{   
    User user = Session["user"] as User;
    string fullAddress = user.fullAddress;
}

在 instanceTwo 上,当调用 set 方法来更新信息时,instanceOne 似乎使用来自 instanceTwo 的数据填充自身。我怎样才能防止这种情况发生?


更新:添加了更多信息以帮助解决以下问题。

所以在我们的解决方案中,我们有一个拥有帐户的用户,每个帐户可以有一个额外的用户。我执行检查以查看 user1 和 user2 是否不为空。

如果 user1 为 true 而 user2 为 null,那么我没有问题。当 user1 & user2 为真时,我在获取信息时遇到问题,因为当我调用该方法来获取用户信息时,它似乎覆盖了用户控件中的 user1 信息。

我需要像一些用户建议的那样包装代码,这样它只会影响自身,而不影响同一页面上的其他控件。我今天将通过一些建议,并尝试尽快回到您的 cmets。


更新我提到了我之前提出的问题

1) How to get variables from .ascx in another .ascx?

我想星期五晚上不是我最好的时间,我基本上在子控件中创建了一个公共方法,在父控件中我可以为每个实例调用公共方法,这样我就可以输入:

  instanceOne.MyMethod();
  instanceTwo.MyMethod();

这似乎是一个很好的解决方法,并且可以帮助我避免使用会话。我将请求删除该问题,因为我的解决方案已经在之前的问题中。

【问题讨论】:

  • 您能否解释一下“第二个实例强制自己更新 instanceOne 上的信息”的意思?
  • 我更新了它,你能看到我在页面上有两个相同的控件,当一个调用自身内部的方法时,它会影响另一个控件,我该如何阻止它?抱歉,我的意思是当调用在第二个实例中更新详细信息的方法时,它会影响第一个实例。
  • 在这两种情况下到底有哪些细节正在改变?您要更改实例的属性吗?
  • 每个控件都有一个被更改的 textbox.text 和 label.text。
  • 这很奇怪——你能把代码贴在你设置属性的地方吗,还有为什么你展示了上面的 SetUserDetails 方法的代码,它们有什么关系?

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


【解决方案1】:

我认为您遇到了这个问题,因为您正在从会话中提取用户对象,而您正在创建的用户实例仍然指向存储在会话中的对象引用。

试试这样的:

string fullAddress = String.Copy(User.FullAddress);

你也可以试试这样的:

private string fullAddress;
public string FullAddress
{
    get { return fullAddress; }
    set { fullAddress = String.Copy(value); }
}

public void SetUserDetails()    
{           
    User user = Session["user"] as User;        
    this.FullAddress = user.fullAddress;   

    this.FullAddress = "Hello world!"; 
}

【讨论】:

  • 这实际上工作得很好,而不是我使用但工作的解决方案!谢谢
【解决方案2】:

在 instanceTwo 上调用 set 方法更新信息时, instanceOne 似乎使用来自 instanceTwo 的数据填充自身。

如果您的 set 操作更新了 Session 中的 User 实例,那么在回发时,您将在两个控件中看到该更新如果您的代码调用 childControl.SetUserDetails()。尝试将您对 SetUserDetails() 的调用包装在 if(!Page.IsPostBack) 块中,或者在 Session 中创建两个可以更新的单独实例。如果您只在页面初始加载时设置子控件的值,那么您应该会在回发时看到不同的值。

另外,请注意,我只是按要求回答问题。这里可能有更好的设计可以使用,但我不太明白你想要完成什么。

【讨论】:

  • 我同意 - 问题一定出在用户会话对象的使用上,但目前还不清楚到底发生了什么
  • 我认为他正在更新 Session 中的一个实例,然后将该实例中的数据绑定到两个控件。如果这两个控件代表两个不同的用户,那么应该有两个单独的实例。
  • 两个单独的会话实例?
  • 不,SessionUser 类的两个单独实例。我认为您有一个存储数据的对象,但您有两个控件来显示它。
  • if (user1 == user) Session["user1"] = user1; if (user2 == user) 会话["user2"] = user2;所以像这样的东西,来解决这个问题?用户 user1 = Session["user1"] as User;
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 2011-06-29
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多