MVC3-AJAXコールで呼び出されるコントローラーアクションのデバッグ
-
27-10-2019 - |
質問
別のドロップダウンで選択された値に基づいて、ドロップダウンを入力しようとしています。私は使っている この男は 例ですが、まだ正常に実行されていません。親のドロップダウンの変更イベントで起動されるAjaxコールが成功しました。 Ajax関数に渡されたデータが正しいことを確認しました。ただし、結果はエラー(200; JSON結果の予期しない文字)です。私は、a)ajaxコールで呼び出されるa)コントローラーアクションとb)結果のリストをコントローラーアクションにフィードする関数をデバッグする方法を把握しようとしてきました。誰かが私がデバッグする方法を理解するのを手伝ってくれますかa)とb)? Visual Studio 2010は、AJAXコールのターゲットをデバッグするための多くのヘルプを提供していません。
これが私が持っているコードです:
1)List Helperクラス関数を呼び出すコントローラーアクション(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();
}
}
解決
それが遠くにあるならば、あなたはブレークポイントを押すべきです。私の推測では、JSON .NETを理解するには、オブジェクトをストリング化する必要があると思います。または、そのような単純なオブジェクトなので、次のようなことをします。
data: "{'id': '" + formData.Id + "'}"
編集
IDを渡すだけなので、技術的にはURLを使用して必要な場所を取得し、データをまったく渡さないことができます。あなたはただこのようなことをするでしょう:
url: url + '/'+ formData.Id
これは、あなたのルートとJavaScriptをしっかりと結合しますが、それは理想的ではありませんが、それは仕事を終わらせます。また、データパラメーターにデータを渡す必要性が削除されます。