C# 如何调试mvc4 razor视图?

C# 如何调试mvc4 razor视图?,c#,asp.net-mvc,debugging,razor,C#,Asp.net Mvc,Debugging,Razor,我习惯于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 her

我习惯于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#。

您需要在视图本身中放置断点。您可以使用razor语法在任何对象上放置断点,例如:

@Html.ActionLink
@{ var x = model.x; }

如果遇到空引用异常,请在视图中使用模型的位置放置断点。

首先,使用
try
块。您的例外情况将在catch block中提供,以供检查、报告等

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
            }
        }

这将有助于看到您看到的异常。我猜当页面呈现时,您会看到一个异常。正如上面提到的“David L”,您希望在Razor视图中设置断点(
Index.cshtml

但是为什么呢?

它有助于理解MVC中请求/响应的生命周期。这是你的电话号码。肯定还有其他人

  • 请求被路由到您的控制器
  • 控制器返回一个
    ActionResult
    返回视图(cnty)
  • MVC将
    ActionResult
    传递给您的视图
  • 尝试使用
    ActionResult
    时,
    Index.cshtml
    中出现异常
我将推测它与已处理的DB上下文对象有关。根据您使用的ORM,以下操作的结果

from r in db.Clients
where r.ClientID == id
select r
是一个
IQueryable
。您可能会惊讶地发现,您的代码在返回视图(cnty)之前尚未与数据库联系被执行。请尝试以下方法:

return View(cnty.ToList());
同样,您看到的确切错误很重要。我的建议假定
Index.cshtml
以以下内容开头:

@model IEnumerable<Client>

不是直接的回答,但是
cnty
永远不会为
null
。它可能是空的,但不是
null
。假设这是一个问题,因为我一开始就设置了一个断点,甚至我视图中的所有行。。。它们中没有一个会阻止程序执行,想法?你在哪个浏览器中调试?如果是IE,您可能会遇到一些问题。在IE中,单击工具->internet选项->高级选项卡->取消选中禁用脚本调试。然后进行一些操作。清洗你的溶液。重建您的解决方案。确保您的web项目已设置为启动项目。这会让你的断点命中。另外,您得到的错误是什么?使用try/catch技巧来阻止它。那会有帮助的,大卫,很抱歉工作被耽搁了几天。。当我输入try-catch时,它甚至不会走那么远,一旦我到达视图调用,它就会脱离,无法进入razor视图代码…您是否碰巧在razor视图中进行了@Html.RenderPartial调用?我想知道是否有什么东西本身在视图中是不可渲染的虽然这是一个很好的提示,但实际上并不能帮助他调试视图本身是的,这是我关于我的另一个问题的观点——这里我被告知不要使用Ienumerable,因为我试图使用的是层次结构数据,而对于你要我做的实验,我没有得到任何东西,没有错误,没有例外,只是有错误的页面,换句话说,我不知道如何找到与浏览器在同一台机器上的web服务器上的经验?那么你应该在浏览器中看到堆栈跟踪。我们需要堆栈跟踪来帮助您。你的
web.config
是否有
?没有打开它,可能这个堆栈跟踪是我如何启动它的问题,或者它会自动抛出并显示给我?@Ed-我视图中的断点没有被击中,但我没有得到堆栈跟踪,只是HTTP 500错误。直到我准备好为止。然后我得到了堆栈跟踪,它告诉我传递的模型是错误的。我修正了这个问题,然后我就可以跨过视图了+1美元。
<system.web>
    <customErrors mode ="Off" />
</system.web>