【问题标题】:How can I debug mvc4 razor views?如何调试 mvc4 razor 视图?
【发布时间】:2013-06-26 07:06:22
【问题描述】:

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

【问题讨论】:

  • 不是直接答案,但cnty 永远不会是null。它可能是empty,但不是null

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


【解决方案1】:

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

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

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

【讨论】:

  • 假设这是一个问题,因为我一开始就设置了一个断点,甚至我认为的所有行...都没有阻止程序执行,想法?
  • 你在什么浏览器中调试?如果是 IE,你可能会遇到一些问题。在IE中,点击工具->internet选项->高级选项卡->取消选中禁用脚本调试。
  • 那么做几件事。清洁您的解决方案。重建您的解决方案。确保您的 Web 项目设置为启动项目。那应该让你的断点命中。另外,您遇到的错误是什么?使用 try/catch 技巧来抓住它。这会有所帮助
  • 抱歉,这几天的工作让我心烦意乱,大卫.. 当我输入 try catch 时,它甚至不会走那么远,只要我接到视图的调用,它就会中断离开,无法进入剃刀视图代码...
  • 您是否偶然在剃刀视图中进行了任何@Html.RenderPartial 调用?我想知道是否偶然某些东西在视图本身中是不可渲染的
【解决方案2】:

查看您所看到的异常会有所帮助。我猜您在页面呈现时会看到异常。正如上面提到的“David L”,您想在 Razor 视图中设置断点 (Index.cshtml)。

但是为什么呢?

它有助于理解 MVC 中请求/响应的生命周期。这是first example I found with a visual。肯定还有其他人。

  • 请求被路由到你的控制器
  • 控制器返回ActionResultreturn View(cnty);
  • MVC 将 ActionResult 传递给您的视图
  • 尝试使用ActionResult 时,您的Index.cshtml 中出现异常。

我将推测它与已处置的 DB 上下文对象有关。根据您使用的 ORM,

的结果
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>

【讨论】:

  • 是的,这就是我关于我的另一个问题stackoverflow.com/questions/17279306/… 的漏洞点——这里我被告知不要使用 Ienumerable 因为我试图使用的层次结构数据和你问的远征我的,我什么也没得到,没有错误,没有异常,只是有错误的页面,换句话说,我不知道如何找到异常
  • 网络服务器是否与您的浏览器在同一台机器上?
  • 然后您应该在浏览器中看到堆栈跟踪。我们需要堆栈跟踪来帮助您。你的web.config&lt;customErrors mode="Off" /&gt; 吗?
  • 没有它,也许这个堆栈跟踪是我将如何启动它的问题,或者它会自动抛出并显示给我?
  • @Ed - 我的视图中没有一个断点被击中,但我没有得到堆栈跟踪,只是 HTTP 500 错误。直到我设置 。然后我得到了堆栈跟踪,它告诉我传递的模型是错误的。我修复了这个问题,然后就可以通过视图了。 +1。
【解决方案3】:

首先,使用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
            }
        }

【讨论】:

  • 虽然是一个很好的提示,但这实际上并不能帮助他调试视图本身
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多