【问题标题】:ASP.NET force dynamically generated control to be treated as newASP.NET 强制将动态生成的控件视为新控件
【发布时间】: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个输入框:

  1. 标签,文本 = "BottleId"
  2. 文本框已禁用,text = "(auto)" - 因为它的值将在数据库中自动生成
  3. 标签,文本 = “姓名”
  4. 文本框
  5. ...

另外,如果需要输入,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


    【解决方案1】:

    我自己设法解决了问题,虽然我不确定如何解决。

    我在问题中提到我曾尝试为每个控件分配一个唯一的 id - 这不起作用。

    当我继续编码时,我认为我需要访问生成的控件,所以我为每个元素添加了一个可预测的 ID(面板、控件、标签等)。

    我假设这个问题的解决方案是父面板,它现在在不同的模型中具有唯一的 id,这在我的测试场景中不是这种情况。

    这解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多