【问题标题】:Strange: property "set" in ASP.NET markup not actually being set奇怪:ASP.NET 标记中的属性“设置”实际上并未设置
【发布时间】:2014-01-28 18:58:06
【问题描述】:

所以我觉得这真的很奇怪,我想知道是否有人听说过这样的事情或者可以理解可能发生的事情......

我有一个用户控件 foo.ascx。在 foo.ascx 中,我声明了 3 个公共属性:val1 val2 和 val3。每个都声明相同:public int。

在一个页面中,我使用我的 foo 控件,并在标签中设置了 val1="10" val2="11" val3="12"。请注意,我在 Visual Studio 中执行此操作,并且智能感知会验证我的属性是否按预期存在。

我在 Page_Load 方法中设置了一个断点并检查属性值:val1 为 10,val2 为 0,val3 为 12。WTF?

所以最初我的属性只是 { get;放; } 类型属性,但出于调试目的,我将一些代码放入每个的 get 和 set 方法中。我在每个设置器中放置了一个断点,我可以在其中检查“值”。每个属性的设置器都有其断点命中,除了 val2 没有任何反应。

我还在 global.asax.cs 中有一个 Application_Error 处理程序,它有一个活动断点,并且没有检测到错误。

有没有人听说过这样的属性被跳过,或者有没有人知道我可以如何更好地跟踪请求的执行以找出真正发生的事情?

编辑:我正在使用 .NET 3.5 并在 Visual Studio 2008 的本地开发服务器上运行

编辑 #2:我无法发布代码,因为它不是我的公司,但我可以说:

  1. 控件仅继承自 System.Web.UI.UserControl
  2. 我在类中每个方法的开头都有一个断点,并且除了 setter 和 Page_Load 之外,没有执行类中的任何代码。

编辑#3:

好的,这很有趣。我开始认为,不知何故存在编译器未捕获的命名冲突(顺便说一句,没有与此问题相关的编译器警告),但无法理解名称的来源。现在我看到名称 sort of 存在于同一范围内。该属性的实际名称是“ClientId”,它与“ClientID”非常接近,事实证明它是我通过 UserControl 继承的 System.Web.UI.Control 的成员。现在从技术上讲,C# 区分大小写,所以它不是命名冲突……但是标记呢?那是区分大小写的吗?我不知道,我的谷歌搜索似乎同时显示“是”和“否”。

所以无论如何我通过检查我的控件的 ClientID 属性对此进行了测试,它仍然设置为自动生成的。但那是因为这个属性是只读的......我是否可能因为我处于不区分大小写的环境中而无意中尝试分配给不同的属性?就像我说的我无法验证,因为 ClientID 是只读的,但这对我来说似乎非常明智。

【问题讨论】:

  • 可能与page lifecycle有关
  • 我猜你在某个地方遇到了逻辑错误。也许给我们看一些代码,以便我们看看。
  • @Jagd 请参阅编辑#2 ...如果可以的话,我会发布代码,但是考虑到除了 Page_Load 和我在任何地方都看不到的设置器之外,没有代码在执行存在逻辑错误。我错过了什么吗?
  • @CDspace 您认为这与页面生命周期有何具体关系?
  • @Paul 您声明您正在使用用户控件。在尝试设置用户控件之前,我遇到了初始化和加载订单的问题

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


【解决方案1】:

现在我看到名称 sort of 存在于同一范围内。该属性的实际名称是“ClientId”,它与“ClientID”非常接近,事实证明它是我通过 UserControl 继承的 System.Web.UI.Control 的成员。现在从技术上讲,C# 区分大小写,所以它不是命名冲突……但是标记呢?那是区分大小写的吗?我不知道,我的谷歌搜索似乎同时显示“是”和“否”。

我相信标记是不区分大小写的(易于检查,所以我会留给您检查)。如果您有多个仅大小写不同的属性,它将因此更新第一个匹配的属性。

我要做的是查看从标记生成的源代码。一个简单的方法是:

  • 向包含编译错误的标记添加服务器脚本块:

    <script runat="server">
      Some invalid C# syntax
    </script>
    
  • 在调试器下运行并导航到相关页面

  • 将显示一个错误页面,其中包含一个用于显示完整生成的源代码的链接。

  • 检查源代码以查看正在设置的属性。

【讨论】:

  • 生成的源显示正确:((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("ClientId", "82");但是我不知道这个 SetAttribute 方法是如何工作的......我会用谷歌搜索它。
  • 我看到 HtmlControl 类有一个不区分大小写的 SetAttribute 实现 (msdn.microsoft.com/en-us/library/…) 我想 UserControl 也可能不区分大小写,但是该片上的文档没有任何评论(@ 987654322@)
  • 另外 +1 以获取有关查看生成源的说明...我从未想过!
  • @Paul - “我想 UserControl 可能也不区分大小写” - 它不区分大小写 - IlSpy 是你的朋友 - 这是有道理的,因为它需要使用不区分大小写的语言,例如VB.NET.
  • 我会为这个 ILSpy 的事情再给你一个 +1...我知道有一段时间我需要了解 IL 和其他“裸机”.NET 主题,但还没有还有时间。非常感谢您确认我无法确认的内容!
【解决方案2】:

没有看到代码,我只能猜测。但是,我怀疑某处有错字。也许你设置了两次 val3。

无论如何,这些问题最终往往是逻辑上显而易见但难以在屏幕上看到的东西。

【讨论】:

  • 正如我所说,智能感知确认变量的存在和拼写。此外,为了确定,我确实将 C# 代码中的属性名称复制/粘贴到标记中。我很确定它的拼写正确。
  • 至于设置值两次,我在设置器中有一个断点,它从不命中,这是我的问题(不是,比如说,一个异常值)。
【解决方案3】:

我也只是猜测,但除了明显难以找到的错字之外,您是否正在使用某种保留/特殊词 来表示不起作用的属性? (广义上的“保留”)

如果您将代码和页面中的val2 更改为whenSpelledLikeThisItWorks 之类的内容会怎样?

【讨论】:

  • 嗯,这也是我现在的想法……请参阅编辑#3。如果我能找到标记不区分大小写的确认,那么这可能就是答案。
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多