调试ASP.NET MVC绑定的最佳实践

时间:2011-01-10 20:18:48

标签: asp.net-mvc

您能否就如何调试ASP.NET MVC绑定给出任何一般性建议?

当一切按预期工作时,ASP.NET MVC非常棒。但是,如果某些事情没有,就像某些事情因某些未知原因而无法结合,我发现很难追查问题并发现自己花费数小时追踪一个看似简单的问题。

让我们假设您使用这样的控制器方法:

[HttpPost]
public ActionResult ShipmentDetails(Order order)
{
    //do stuff
}

让我们进一步想象Order类看起来像这样:

public class Order
{
    public decimal Total {get; set;}
    public Customer Customer {get; set;}
}

public class Customer
{
    public string Name {get; set;}
    public string Phone {get; set;}
}

当控制器方法中的Order未正确绑定时,有什么好的开始?只有部分Order被正确绑定时,有什么好的开始?

6 个答案:

答案 0 :(得分:25)

尽管@russ's answer很有用并且有时是必要的,但是当主要问题更多地是关于大局时,两个选项似乎都有点低。因此,我建议Glimpse

从它的关于页面:

  

... Glimpse允许您直接在浏览器中调试您的网站或Web服务。 Glimpse允许您“瞥见”Web服务器中正在发生的事情。换句话说,Firebug是调试客户端代码的,Glimpse是在客户端内调试服务器。

既然您已经特别询问了数据绑定,那么您需要查看binding tab documentation。您将能够再次从文档中看到:

  1. Ordinal :MVC模型绑定基础结构尝试绑定可用数据的顺序
  2. 模型活页夹:在给定方案中使用的模型活页夹
  3. 属性/参数:Binder试图绑定的东西的名称
  4. 类型:Binder试图绑定的东西的类型
  5. 尝试过的价值提供商:Binder尝试用来获取给定值的提供商(以及是否成功)
  6. 尝试的值:提供商必须使用的实际值(发布类型对话等)
  7. 文化:用于解析原始值的文化 原始值:提供者必须使用的原始值(预类型对话等)
  8. 请参阅quick start。简言之:

    1. 安装glimpse.mvc3
    2. 转到http://yourhost/yourapp/Glimpse.axd并“启用它。”
    3. 点击应用中任意视图右下方的一瞥图标,了解详情。

答案 1 :(得分:21)

正如Darin所建议的那样,首先使用Firebug,Fiddler或其他Web调试代理工具检查从客户端发送到服务器的内容。

如果不这样做,您可能需要单步执行源代码以查看绑定期间发生的情况。

我建议这样做的两种方法是

  1. Include the System.Web.Mvc source code project in your application and reference this。这对学习有好处,但可能不建议用于商业应用。

  2. 从Microsoft Symbol服务器下载System.Web.Mvc的符号,将您的设置更改为 debug framework source code and set a break point appropriately to step through

答案 2 :(得分:3)

一个好的起点是下载并安装FireBug,看看从客户端发布到服务器的内容。然后你会看到缺少什么,不正确,... Model Binding to a List之类的博客帖子也是很好的读取,以便熟悉默认模型绑定器使用的正确语法。

答案 3 :(得分:3)

就我而言,查看controller方法中的ModelState属性提供了为什么模型绑定失败的答案。

enter image description here

答案 4 :(得分:2)

从Visual Studio一侧:

  • 在进入端点时设置一个断点。
  • 通过“调试”菜单选项打开“立即”。

键入ModelState.Keys.ToList()

  • 这将按名称/键显示绑定错误。

最好键入ModelState.Values.ToList()...

Model State Values display

答案 5 :(得分:0)

在控制器方法中放置一个断点,并注意Request.Params,以了解根据och参数实际进入控制器的内容。