gpt4 book ai didi

c# - Textbox.Text 的值错误

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:51 24 4
gpt4 key购买 nike

我有一个列出当前项目的页面,如果您选择其中一个项目,它会加载带有参数的同一页面并显示属于该项目的用户。出于某种原因,它有时(取决于项目)在用户名所在的文本框中显示项目名称。

    protected void Page_Load(object sender, EventArgs e)
{
var dbProxy = new DatabaseProxy();

// No parameter, show project list
if (this.Request.QueryString["ProjectID"] == null)
{
var user = new UserContainer();
user.LoadUser(HttpContext.Current.User.Identity.Name);

List<ProjectContainer> projects = dbProxy.GetProjects(user.UserID, true);

foreach (ProjectContainer project in projects)
{
var linkButton = new Button {Text = project.ProjectName};
this.ProjectsPanel.Controls.Add(linkButton);
}
}
// We have a parameter, show users for project
else
{
int projectId = int.Parse(this.Request.QueryString["ProjectID"]);
this.LoadUsers(projectId);
}
}

LoadUsers 函数:

    private void LoadUsers(int projectId)
{
var databaseProxy = new DatabaseProxy();
List<UserContainer> users = databaseProxy.GetUsersByProject(projectId);

foreach (UserContainer user in users)
{
var txtUsername = new TextBox();
txtUsername.Text = user.Username; // <- Shows projectname!
var txtUsername2 = new TextBox();
txtUsername2.Text = user.Username; // <- Shows username!

this.UserPanel.Controls.Add(txtUsername);
this.UserPanel.Controls.Add(txtUsername2);
}
}

HTML代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EditUsers.aspx.cs" Inherits="xxx.EditUsers1" MasterPageFile="PageStructure.Master" %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlace">
<asp:Panel ID="Panel1" runat="server" style="padding-left: 25px">
<div style="margin-bottom: 50px">
<asp:Label ID="lblHeader" runat="server" Text="Benutzer verwalten" CssClass="PageHeader"></asp:Label>
</div>
<asp:Panel ID="UserPanel" runat="server"></asp:Panel>
<asp:Panel ID="ProjectsPanel" runat="server"></asp:Panel>
</asp:Panel>
</asp:Content>

母版页仅包含页眉和页脚以及不同页面的一些 JavaScript。

输出:

http://i.imgur.com/wAxTSjT.png

user 变量包含正确的值,在 LoadUsers 之后什么也没有发生。我什至可以添加一个空标签作为第一个元素,然后它会在第一个文本框中显示正确的用户名!我不知道为什么,但看起来它真的想要我添加的第一个元素中的项目名称。

还有它如何工作的例子:

    private void LoadUsers(int projectId)
{
var databaseProxy = new DatabaseProxy();
List<UserContainer> users = databaseProxy.GetUsersByProject(projectId);

foreach (UserContainer user in users)
{
var lbl = new Label();
lbl.Text = ""; <- Stays invisible!
var txtUsername = new TextBox();
txtUsername.Text = user.Username; // <- Shows username!
var txtUsername2 = new TextBox();
txtUsername2.Text = user.Username; // <- Shows username!

this.UserPanel.Controls.Add(lbl);
this.UserPanel.Controls.Add(txtUsername);
this.UserPanel.Controls.Add(txtUsername2);
}
}

我想我可以找到一个解决方法,比如将它拆分为两个不同的网络表单,但我仍然想知道为什么我会得到错误的值。

最佳答案

问题是由控件的不同步 View 状态引起的。

在 ASP.NET 中,每个表单控件都有一个 View 状态来跟踪输入的值,以便在回发后重新加载页面时,它可以自动将以前的值填充到每个表单控件中。通常这会很好地工作,并且通常是所需的行为。但是,在某些情况下(例如这种情况),控件是动态生成的并且它们的值在从回发返回后发生更改,那么它们的 View 状态最终将覆盖值并因此导致问题。

要解决此问题,请为动态生成的控件禁用回发,如下所示:

foreach (UserContainer user in users)
{
var txtUsername = new TextBox();
txtUsername.EnableViewState = false;
txtUsername.Text = user.Username; // <- Shows projectname!

var txtUsername2 = new TextBox();
txtUsername2.EnableViewState = false;
txtUsername2.Text = user.Username; // <- Shows username!

this.UserPanel.Controls.Add(txtUsername);
this.UserPanel.Controls.Add(txtUsername2);
}

或者每次生成时给每个控件分配一个不同的ID,这样控件就永远不会匹配viewstate中保存数据的ID,像这样:

foreach (UserContainer user in users)
{
var txtUsername = new TextBox();
txtUsername.ID = Guid.NewGuid().ToString("N");
txtUsername.Text = user.Username; // <- Shows projectname!

var txtUsername2 = new TextBox();
txtUsername2.ID = Guid.NewGuid().ToString("N");
txtUsername2.EnableViewState = false;
txtUsername2.Text = user.Username; // <- Shows username!

this.UserPanel.Controls.Add(txtUsername);
this.UserPanel.Controls.Add(txtUsername2);
}

警告:如果您使用上述任何一种方法,控件的值将不会在回发或表单提交期间发回。因此,任何这些控件中的任何用户输入的值都将丢失。为避免此问题,请使用 Javascript 将这些值复制到表单提交时的隐藏控件(即动态生成)。或者干脆不使用动态生成的控件(如果可能的话)。

有关 View 状态与动态控件的更多信息,请查看:http://msdn.microsoft.com/en-us/library/hbdfdyh7%28v=vs.100%29.aspx

关于c# - Textbox.Text 的值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23468405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com