所以我发现这真的很奇怪,我想知道是否有人听说过这样的事情,或者想知道可能会发生什么......
我有一个用户控件foo.ascx。在foo.ascx中,我声明了3个公共属性:val1 val2和val3。每个都声明相同:public int。
在页面中我使用我的foo控件,在标签中我设置val1 =“10”val2 =“11”val3 =“12”。请注意,我在Visual Studio中执行此操作,intellisense验证我的属性是否按预期存在。
我在Page_Load方法中设置了一个断点并检查属性值:val1为10,val2为0,val3为12. WTF?
所以最初我的属性只是{get;组; } type properties,但出于调试目的,我将一些代码放入每个的get和set方法中。我在每个设置器中放置一个断点,我可以检查“值”。对于val2,每个属性的setter的断点都是EXCEPT,没有任何反应。
我还在global.asax.cs中有一个带有活动断点的Application_Error处理程序,并且没有检测到错误。
有没有人听说过像这样跳过某个属性,或者是否有人知道如何更好地跟踪请求的执行情况以找出真正发生的事情?
编辑:我正在使用.NET 3.5并在Visual Studio 2008中的本地开发服务器上运行
编辑#2:我无法发布代码,因为我的公司不是我的,但我可以说:
编辑#3:
好的,这非常有趣。我开始认为某种程度上存在编译器没有被编译器捕获的命令冲突(没有与此问题相关的编译器警告BTW)但是无法理解名称可能来自哪里。现在我看到名称排序存在于同一范围内。该属性的实际名称是“ClientId”,它非常接近“ClientID”,它结果是我通过UserControl继承的System.Web.UI.Control的成员。现在技术上C#是区分大小写的,所以它不是命名冲突......但是标记怎么样?这种情况敏感吗?我不知道,我的谷歌搜索似乎提出“是”和“否”两者。
所以无论如何我通过检查我的控件的ClientID属性来测试它,它仍然设置为自动生成的属性。但那是因为这个属性是readonly ...我是否可能无意中尝试分配给不同的属性,因为我处于不区分大小写的环境中?就像我说的那样我无法验证,因为ClientID是只读的,但这对我来说似乎是非常。
答案 0 :(得分:2)
现在我看到名称排序存在于同一范围内。该属性的实际名称是“ClientId”,它非常接近“ClientID”,它结果是我通过UserControl继承的System.Web.UI.Control的成员。现在技术上C#是区分大小写的,所以它不是命名冲突......但是标记怎么样?这种情况敏感吗?我不知道,我的谷歌搜索似乎提出“是”和“否”两者。
我认为标记不区分大小写(易于检查,所以我会留给你这样做)。因此,如果您有多个仅在大小写不同的属性,它将更新第一个匹配属性。
我想看看从标记生成的源代码。一个简单的方法是:
将服务器脚本块添加到包含编译错误的标记:
<script runat="server">
Some invalid C# syntax
</script>
在调试器下运行并导航到相关页面
将显示一个错误页面,其中包含显示完整生成的源代码的链接。
检查源代码以查看正在设置的属性。
答案 1 :(得分:0)
没有看到代码,我只能猜测。但是,我怀疑某处有拼写错误。也许你要两次设置val3。
无论如何,这些问题往往会在逻辑上显而易见,但很难在屏幕上看到。
答案 2 :(得分:0)
我也只是在猜测,但除了明显难以发现的拼写错误之外,您是否正在使用某种保留/特殊字来处理无效的属性? (在最广泛的意义上“保留”)
如果您在代码和页面中将val2
更改为whenSpelledLikeThisItWorks
,会发生什么情况?