为什么.NET在表单标记内发生异常时会识别错误的行号?以下是Razor .cshtml文件中的一个简单测试用例:
@{
string[] test = new string[2];
test[0] = "stuff";
}
@test[0] <br />
<form action="~music/addToCart" method="post">
<input type="text" name="test" value="@test[2]" />
<input type="submit" value="Submit" />
</form>
当实际异常为test[0]
时,异常“索引超出数组范围”会显示test[2]
行。调试器还显示错误的行。似乎在表单标记内发生异常时,表单上方的语句被错误地标识为错误的位置。我尝试过使用Html帮助器BeginForm()
并得到了类似的行为。
使用Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.7.2117.0。 2017年Visual Studio社区。 p>
答案 0 :(得分:3)
我能够重现这一点。我有一个理论:
考虑原始代码(带行号):
1 - @{
2 - ViewBag.Title = "Home Page";
3 - }
4 -
5 - @{
6 - string[] test = new string[2];
7 - test[0] = "stuff";
8 - }
9 - @test[0] <br />
10 -
11 - <form action="~music/addToCart" method="post">
12 - <input type="text" name="test" value="@test[2]" />
13 - <input type="submit" value="Submit" />
14 - </form>
调试器报告第9行有错误,但我认为这是razor的行号。如果我们拿出任何纯文本(非剃须刀):
1 - @{
2 - ViewBag.Title = "Home Page";
3 - }
4 - @{
5 - string[] test = new string[2];
6 - test[0] = "stuff";
7 - }
8 - @test[0] <br />
9 - <input type="text" name="test" value="@test[2]" />
我们看到错误发生在Razor上下文中的第9行。
我认为调试器会收到带有剃刀行号的错误信息,并根据文件布局行号消耗它。
绝对是一个错误。如果某人尚未报告,您应该报告。