【问题标题】:Razor exception wrong line number in form表单中的 Razor 异常错误行号
【发布时间】:2017-12-14 19:26:18
【问题描述】:

当表单标签内发生异常时,为什么 .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[2] 时,异常“索引超出数组范围”显示带有test[0] 的行。调试器还显示不正确的行。似乎当表单标签内发生异常时,表单上方的语句被错误地标识为错误的位置。我尝试使用 Html 助手BeginForm() 并得到了类似的行为。

使用 Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.7.2117.0。 Visual Studio 社区 2017。

【问题讨论】:

  • test[0] 有两行。你指的是哪一个?
  • @test[0] 错误地显示为错误。抱歉,我的问题不清楚。
  • 这是 cshtml 文件被编译为 c# 类文件的不幸副作用,该文件的结构/布局与 .cshtml 文件略有不同

标签: c# asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

我能够重现这一点。我有一个理论:

考虑原始代码(带有行号):

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 行。

我认为调试器接收到带有剃刀行号的错误信息,并根据文件布局行号使用它。

绝对是一个错误。如果有人还没有,你应该报告它。

【讨论】:

  • 当有问题的代码在表单标签内被赋予一个有效的索引并且@test[2] 被放置在关闭表单标签的下方时,调试器会识别出正确的行。我认为这与你的理论相矛盾。然而,这是一个比我想出的任何理论都更好的理论。
  • @Apollo:你是对的。我对此进行了测试,当错误代码位于表单标记之外(之前或之后)时,它会将正确的行报告为异常源。这似乎表明它是表单标签的 Razor 处理抛出了调试器/报告。
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2012-12-31
  • 2017-07-23
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多