【问题标题】:Best practices for debugging ASP.NET MVC Binding调试 ASP.NET MVC 绑定的最佳实践
【发布时间】:2011-01-10 20:18:47
【问题描述】:

您能给我关于如何调试 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 的一部分被正确绑定时,有什么好的起点?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    虽然@russ's answer 很有用并且有时是必要的,但当主要问题更多是关于大局时,这两个选项似乎有点低。因此,我推荐Glimpse

    从它的关于页面:

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

    由于您专门询问了数据绑定,因此您需要查看binding tab documentation。您将能够再次从文档中看到:

    1. Ordinal:MVC 模型绑定基础结构尝试绑定可用数据的顺序
    2. Model Binder:在给定场景中使用的 Model Binder
    3. 属性/参数:Binder 试图绑定的东西的名称
    4. Type:Binder 试图绑定的东西的类型
    5. Attempted Value Providers:Binder 尝试用来获取给定值的提供程序(以及是否成功)
    6. 尝试值:提供者必须使用的实际值(帖子类型对话等)
    7. 文化:用于解析原始值的文化 原始值:提供者必须使用的原始值(预类型对话等)

    请参阅quick start。简要说明:

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

    【讨论】:

      【解决方案2】:

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

      如果做不到这一点,您可能需要单步调试源代码以查看绑定期间发生的情况。

      我可以推荐的两种方法是

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

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

      【讨论】:

      • "set a break point appropriately" 模型活页夹在哪里?
      • 您想在 MVC 框架的 DefaultModelBinder 类的 public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 方法上设置断点
      • 启用/下载符号后,如何才能真正找到DefaultModelBinder 的源代码以设置断点?
      • NM,手动输入断点可以工作,尽管它确实给出了一条消息说它找不到函数(或类似的东西)。
      【解决方案3】:

      在我的例子中,查看控制器方法中的 ModelState 属性提供了模型绑定失败的答案。

      【讨论】:

      • 看起来这是特定于 ASP.NET Core 的
      • 我刚刚在 ASP.NET Web Api 中尝试过,我可以在我的 Web API 方法的“本地窗口”中看到 ModelState。
      【解决方案4】:

      一个好的起点是下载并安装FireBug,然后查看从客户端发布到服务器的内容。然后,您将看到缺少的、不正确的……诸如 Model Binding to a List 之类的博客文章也很适合阅读,以了解默认模型绑定器使用的正确语法。

      【讨论】:

      • 但它并没有告诉你 mvc 绑定对数据做了什么……有没有办法跟踪模型绑定过程?
      • @Dani,关于模型绑定你想了解什么?这很简单:名为Customer.Name 的输入字段将绑定到模型的复杂Customer 属性的Name 属性。它没有什么特别之处。一旦你了解了列表和集合的概念,你就会知道模型绑定是如何工作的。如果没有,FireBug 会向您显示请求,您会立即知道为什么一个属性没有被绑定:这是因为请求中缺少它、名称无效或格式无效。
      • 我想我缺少的是集合和列表,以及如何处理新项目。到目前为止,我使用的示例将行添加到具有随机 id 的网格中,并且在我的代码中没有任何限制,我见过一个尝试重新编号的示例,但是原始示例 (steve Sandersen) 没有它就可以工作... ..
      【解决方案5】:

      从 Visual Studio 方面:

      • 在端点入口处设置断点。
      • 通过调试菜单选项打开立即。

      输入 ModelState.Keys.ToList()

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

      最好还是输入 ModelState.Values.ToList()...

      【讨论】:

      • .NET Core?
      【解决方案6】:

      在您的控制器方法中放置一个断点并监视 Request.Params 以查看实际进入控制器的 och 参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        相关资源
        最近更新 更多