MVC3 - 调试由Ajax调用调用的控制器操作

时间:2011-12-02 19:54:08

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

我正在尝试根据在另一个下拉列表中选择的值填充下拉列表。我正在使用this guy's示例,但还没有成功运行它。我有一个成功的Ajax调用,该调用是在父下拉列表的change事件上触发的。我已经验证了传递给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();
    }
}

1 个答案:

答案 0 :(得分:4)

你应该达到突破点,如果它做到那么远。我的猜测是你需要对你的对象进行字符串化以使json .net能够理解。或者,因为它是一个如此简单的对象,所以只需执行以下操作:

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

修改

因为你只是传入一个id,所以你可以在技术上只使用url到达你想要的地方,根本不传递任何数据。你会做这样的事情:

url: url + '/'+ formData.Id

这确实紧密地结合了你的路线和javascript,这不是理想的,但它完成了工作。它不需要将任何数据传递给数据参数。