如何调试MVC4 Razor视图?

9

我习惯使用C#和VB.NET Winforms,通常可以通过设置断点并逐步执行代码来找到所需的所有错误。

我想知道我做错了什么。

我在这里设置断点:

public ActionResult Index(int id)
{
    var cnty = from r in db.Clients
               where r.ClientID == id
               select r;

    if (cnty != null) // breakpoint here
    {
        return View(cnty); // F11 jumps over this section of code returning me to the error page below.
    }
    return HttpNotFound();
}

我完全不知道它到底在哪里或为什么出错。我该如何找出出错的原因,或者更好的方法是找出它抛出了什么错误?

我正在使用VS2012 mvc4 c#。


3
不是直接的答案,但是 cnty 永远不会是 null。它可能是 _空的_,但不是 null - D Stanley
3个回答

11

你需要在视图本身中设置断点。你可以使用Razor语法在任何地方放置断点,例如:

@Html.ActionLink
@{ var x = model.x; }
如果您遇到了空引用异常,请在视图中使用模型的地方放置断点。

我在设置断点时遇到了问题,即使在我的视图中设置了所有行的断点,程序仍然不会停止执行。有什么想法吗? - Pakk
你在调试哪个浏览器?如果是IE,可能会遇到一些问题。在IE中,点击工具->Internet选项->高级选项卡->取消勾选禁用脚本调试。 - David L
抱歉,David。工作让我分心了几天。当我加入try-catch时,它甚至无法执行到那一步,在调用视图时就会崩溃,无法进入Razor视图代码。 - Pakk
抱歉,除了@model OilNGasWeb.ModelData.Clients之外,我已经将所有内容都注释掉了。 - Pakk
如果您遇到视图渲染错误,您可以尝试使用 try/catch 捕获并抛出错误。如果您附加了调试器,则可以在 Visual Studio 中进行操作。 - David L
显示剩余4条评论

4
希望您能提供您所看到的异常信息。我猜测您在页面渲染时遇到了异常。正如上面的“David L”所指出的,您需要在Razor视图(Index.cshtml)中设置断点。
但为什么要这样做呢?
了解MVC请求/响应的生命周期会有所帮助。这里是我找到的第一个带有可视化效果的示例。当然,还有其他的示例。
  • 请求被路由到您的控制器
  • 控制器返回一个 ActionResult: return View(cnty);
  • MVC将 ActionResult 传递给您的视图
  • 当尝试使用 ActionResult 时,异常发生在您的 Index.cshtml 中。
我猜测这可能与已释放的DB上下文对象有关。根据您使用的ORM,ActionResult 的结果可能会受到影响。
from r in db.Clients
where r.ClientID == id
select r

是一个 IQueryable<Client>。当执行 return View(cnty); 前,您可能会惊讶地发现您的代码还没有连接数据库。请尝试使用以下代码:

return View(cnty.ToList());

再次强调,你看到的确切错误非常重要。我的建议假定Index.cshtml以以下内容开头:

@model IEnumerable<Client>

更新:

根据下面评论中的OP所说,堆栈跟踪不可用。有许多问题专门用于在开发过程中查看浏览器中的堆栈跟踪。请至少确认在您的web.config文件中设置了以下内容。

<system.web>
    <customErrors mode ="Off" />
</system.web>

是的,这就是我在我的另一个问题中的全部观点。http://stackoverflow.com/questions/17279306/how-to-pass-one-to-many-from-controller-to-view-in-mvc4/17279523?noredirect=1#comment25053983_17279523 -- 在这里,我被告知不要使用Ienumerable<client>,因为我正在尝试使用层次数据,并且对于您要求的异常,我没有得到任何东西,没有错误,没有异常,只有带有错误的页面,换句话说,我不知道如何找到异常。 - Pakk
Web服务器是否与您的浏览器在同一台机器上? - Ed Chapel
然后您应该在浏览器中看到堆栈跟踪。我们需要堆栈跟踪来帮助您。您的 web.config 文件是否有 <customErrors mode="Off" /> - Ed Chapel
没有输出,也许是堆栈跟踪出了问题,我该如何开始调试?还是会自动抛出并显示给我吗? - Pakk
@Ed - 我的视图中没有任何断点被触发,但我没有得到堆栈跟踪,只有HTTP 500错误。直到我设置了<customErrors mode ="Off" />,然后我才得到了堆栈跟踪,告诉我传递的模型是错误的。我修复了这个问题,然后就能够逐步执行视图了。对于<customErrors mode ="Off" />,加1。 - Keith Ketterer

0
首先,使用一个try块。你的异常将在catch块中可用于检查、报告等。
public ActionResult Index(int id)
        {
            try
            {
            var cnty = from r in db.Clients
                       where r.ClientID == id
                       select r;

            if (cnty != null) // breakpoint here
            {
                return View(cnty); // F11 jumps over this section of code returning me to the error page below.
            }
            return HttpNotFound();
            }
            catch (Exception ex)
            { 
                  //report error
            }
        }

1
虽然这是一个很好的提示,但它实际上并不能帮助他调试视图本身。 - David L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接