【问题标题】:MVC3 - Debugging the controller action called by an Ajax callMVC3 - 调试由 Ajax 调用调用的控制器操作
【发布时间】:2011-12-02 19:54:08
【问题描述】:

我正在尝试根据在另一个下拉列表中选择的值填充下拉列表。我正在使用this guy's 示例,但尚未成功运行。我有一个成功的 Ajax 调用,它在父下拉列表的更改事件中触发。我已经验证了传递给 Ajax 函数的数据是正确的。但是,结果是错误(200;JSON 结果中出现意外字符)。我一直试图弄清楚如何调试 a) 在 Ajax 调用中调用的控制器操作和 b) 将结果列表提供给控制器操作的函数。谁能帮我弄清楚如何调试a)和b)? Visual Studio 2010 似乎没有为调试 Ajax 调用的目标提供很多帮助。

这是我的代码:

1) 控制器操作 (BreedController) 调用列表帮助类函数以将 JSON 对象返回给 Ajax 成功回调。

    //
    // Retrieve JSON object containing breeds for a given species
    //
    [HttpPost]
    public JsonResult BreedsBySpecies(int? id)
    {
        ListHelper lh = new ListHelper();
        return Json(new { items = lh.GetBreedsBySpecies(id) }, JsonRequestBehavior.AllowGet);
    }

2) 应该返回给定物种 ID 的品种的 SelectItemList 的函数。这由控制器操作调用。

    public List<SelectListItem> GetBreedsBySpecies(int? speciesID)
    {

        var breed = from b in db.Breeds
                    select b;

        if (speciesID.HasValue)
        {
            breed = breed.Where(b => b.SpeciesID == speciesID);
        }

        List<SelectListItem> lst = new List<SelectListItem>();
        foreach (var item in breed)
        {
            lst.Add(new SelectListItem { Text = item.Description, Value = item.BreedID.ToString() });
        }

        return lst;
    }

3) 执行 Ajax 调用的 javascript 函数。我已经确认这得到了正确的值(例如,“/Breed/BreedsBySpecies”以获取正确的控制器操作,并且 formData 包含正确的物种 ID)

function selectFromAjax(url, formData, target) {
    $(target).html("");
    if (formData.id) {
        $.ajax({
            type: 'POST',
            url: url,
            data: formData,
            dataType: 'text json',
            contentType: 'application/json; charset=utf-8',
            success: function (data, textStatus) {
                if (data) {
                    $(data.items).each(function () {
                        $(target).append($("<option></option>").attr("value", this.Value).text(this.Text));
                    });
                    $(target).change();
                }
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
            }
        });
    }
    else {
        $(target).change();
    }
}

【问题讨论】:

  • 我安装了 firebug,但我不明白这将如何让我调试 VS2010 代码?我该怎么做?
  • 打开网站和萤火虫。刷新网站并在 firebug 中单击控制台以查看错误。它应该向您显示错误。如果没有,请转到脚本选项卡并在那里找到您的文件和代码。您也可以在那里创建断点并调试您的 javascript。
  • 这表明 Ajax 错误回调正在被触发,但它根本没有让我进入 C# 代码。据我所知,Ajax 调用按预期工作。这是我正在尝试调试的 C# 代码,但没有命中断点。
  • 尝试从你的ajax调用中删除成功和失败,然后它应该会出现一个错误,当你点击它并选择html时,它会显示错误页面,就像普通的asp一样.net 错误页面。

标签: ajax asp.net-mvc-3 visual-studio-debugging


【解决方案1】:

如果它做到了那么远,你应该打断点。我的猜测是你需要对你的对象进行字符串化才能让 json .net 能够理解。或者,由于它是如此简单的对象,只需执行以下操作:

 data: "{'id': '" + formData.Id + "'}"

编辑

由于您只是传入一个 id,从技术上讲,您可以只使用 url 来获取您想要的位置,根本不传递任何数据。你只需要这样做:

url: url + '/'+ formData.Id

这确实将您的路由和 javascript 紧密结合在一起,这并不理想,但它可以完成工作。它消除了将任何数据传递给 data 参数的需要。

【讨论】:

  • 我已经在控制器操作和列表辅助函数中尝试过断点,但它从来没有命中。我假设(呃,哦,又是那个词),这是因为控制器动作是在 Ajax 调用的上下文中被调用的。无论如何都应该命中控制器操作或辅助函数中的断点?
  • @NealHelman,是的。问题是由于 mvc modelbinder 无法将您的 json 解析为您具有方法签名的东西,因此没有调用该方法。我实际上已经想到了一种更简单的替代方案,它适用于这些简单的单参数 id 事物。看我的回答。
  • 谢谢。这让我进入了下一步,尽管我仍然不知道控制器动作和辅助函数中发生了什么,这才是我真正需要关注的。
  • 我要调试 VS2010 代码。我真是个笨蛋@55。我在被调用的控制器上有一个 AuthorizeAttribute。简化 ajax 调用似乎是我需要知道发生了什么的事情。
  • 遇到了同样的问题,结果我不小心将控制器操作标记为私有,因此 AJAX 调用没有看到它。只是检查断点是否从未被命中。
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多