C# ASP.NET强制将动态生成的控件视为新控件
我正在开发一个基于实体框架的数据操作web ui 假设我有以下两种模型:C# ASP.NET强制将动态生成的控件视为新控件,c#,asp.net,database,entity-framework,C#,Asp.net,Database,Entity Framework,我正在开发一个基于实体框架的数据操作web ui 假设我有以下两种模型: public class Bottle { [Key] public Int32 BottleId { get; set; } [Required] [MinLength(3)] [MaxLength(128)] public String Name { get; set; } [Required] public virtual BottleType Bo
public class Bottle
{
[Key]
public Int32 BottleId { get; set; }
[Required]
[MinLength(3)]
[MaxLength(128)]
public String Name { get; set; }
[Required]
public virtual BottleType BottleType { get; set; }
}
public class BottleType
{
[Key]
public Int32 BottleTypeId { get; set; }
[Required]
[MinLength(3)]
[MaxLength(128)]
public String Name { get; set; }
public virtual ICollection<Bottle> Bottles { get; set; }
}
web ui将显示一个下拉列表,其中包含两个条目,一个用于瓶子
,另一个用于瓶子类型
。如果更改了选择,将根据模型的特性生成新控件
例如,如果选择了瓶子
,将生成6个控件-3个标签和3个输入框:
强制
将附加到每个控件的标签上
现在谈论我的问题;当我更改下拉列表的选定索引时,将使用
panel.controls.clear()
删除控件。之后,将为所选模型生成新控件
我不确定问题的原因是什么,可能是页面上控件的“位置”导致asp.net将其视为“相同”
这是一个被截取的代码
1 | Panel p = new Panel();
2 | Label l = new Label
3 | {
4 | Text = "bar" // this would be the name of the property
5 | };
6 | p.Controls.Add(l);
7 | if ( ... required check ... )
8 | {
9 | // is required
10 | l.Text += " (mandatory)";
11 | }
在第2行之后,l.Text
等于bar
(就像它应该是的那样)。但是,如果之前的模型具有同名的属性,它会将第6行后面的l.Text
的值更改为bar(强制)
(这是之前模型的标签值),这将导致第10行后面的bar(强制)(强制)
长话短说:我可以强制asp.net将生成的控件视为新控件吗? 每次使用
Guid.NewGuid().ToString()
生成标签时,我都尝试给它一个唯一的id,以指示不同的实例,但这似乎不起作用
我找不到关于这个主题的任何相关问题,因为大多数时候人们希望重新生成控件并保留它们的值。。但我的情况并非如此。我自己设法解决了这个问题,尽管我不知道如何解决 我在问题中提到,我曾尝试为每个控件分配一个唯一的id,但没有成功 当我继续编码时,我发现我需要访问生成的控件,因此我为每个元素添加了一个可预测的id(面板、控件、标签等等) 我假设这个问题的解决方案是父面板,它现在在不同的模型中有一个uniqe id,这在我的测试场景中不是这样的
这就解决了问题。我自己设法解决了问题,尽管我不知道如何解决 我在问题中提到,我曾尝试为每个控件分配一个唯一的id,但没有成功 当我继续编码时,我发现我需要访问生成的控件,因此我为每个元素添加了一个可预测的id(面板、控件、标签等等) 我假设这个问题的解决方案是父面板,它现在在不同的模型中有一个uniqe id,这在我的测试场景中不是这样的 这就解决了问题
1 | Panel p = new Panel();
2 | Label l = new Label
3 | {
4 | Text = "bar" // this would be the name of the property
5 | };
6 | p.Controls.Add(l);
7 | if ( ... required check ... )
8 | {
9 | // is required
10 | l.Text += " (mandatory)";
11 | }