【发布时间】:2017-06-14 11:59:08
【问题描述】:
我正在开发一个基于实体框架的用于数据操作的 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 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; }
}
这些模型的可能值是
Bottle {
Name = "Foo"
BottleType = BottleType {
Name = "Unicorn Bottle"
}
}
Web ui 将显示一个下拉列表,其中包含两个条目,一个用于Bottle,一个用于BottleType。如果选择更改,将根据模型的属性生成新的控件。
例如,如果选择Bottle,将生成6个控件——3个标签和3个输入框:
- 标签,文本 = "BottleId"
- 文本框已禁用,text = "(auto)" - 因为它的值将在数据库中自动生成
- 标签,文本 = “姓名”
- 文本框
- ...
另外,如果需要输入,mandatory 将附加到每个控件的标签中。
现在谈谈我的问题;当我更改下拉列表的选定索引时,将使用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 (mandatory)(这是之前模型的标签的值),这将导致@987654333 @ 第 10 行之后。
长话短说:我可以强制 asp.net 将生成的控件视为新控件吗?
我尝试在每次使用 Guid.NewGuid().ToString() 生成标签时为其指定一个唯一 ID,以指示不同的实例,但这似乎不起作用。
我找不到关于这个主题的任何相关问题,因为大多数时候人们想要重新生成控件并保持他们的价值观,但在我的情况下不是。
【问题讨论】:
标签: c# asp.net database entity-framework