JQuery AJAXパラメーターとして複雑なオブジェクトを含むコントローラーアクションメソッドの呼び出しを達成しようとしています。私はたくさんのブログを読み、これらから学んだいくつかのテクニックを試しました。 Stackoverflow post here を使用して、(以下の)最善の試行コードを作成しました。
ユーザーがフィールドからタブで移動したときに呼び出される非同期投稿をトリガーしたい[フォーム保存投稿ではなく、他の例で示したように]。
私の意図は:
結果はJSON結果として返されます。返される結果に応じて、ビューのフィールドにデータがロードされます。
問題は次のとおりです。
誰かが助けてくれることを願っています。ありがとう。以下のコード:
クライアントjsファイル
var disputeKeyDataObj = {
"InvoiceNumber": "" + $.trim(this.value) + "",
"CustomerNumber": "" + $.trim($('#CustomerNumber').val()) + ""
};
var disputeKeyDataJSON = JSON.stringify(disputeHeadlineData);
$.ajax({
url: "/cnr/GetDataForInvoiceNumber",
type: "POST",
data: disputeKeyDataJSON,
dataType: 'json',
contentType: "application/json; charset=utf-8",
success: EnrichedDisputeKeyData(result)
});
Actionアクションパラメーターに関連付けられたタイプのフィルターとクラス
[DataContract]
public class DisputeKeyData
{
[DataMember(Name = "InvoiceNumber")]
public string InvoiceNumber { get; set; }
[DataMember(Name = "CustomerNumber")]
public string CustomerNumber { get; set; }
}
コントローラーのアクションメソッド
//[HttpPost]
[ObjectFilter(Param = "disputeKeyData", RootType = typeof(DisputeKeyData))]
public ActionResult GetDataForInvoiceNumber(DisputeKeyData disputeKeyData)
{
//Blah!
//....
return Json(disputeKeyData, JsonRequestBehavior.AllowGet);
}
以下は、これがどのように機能するかを示しています。
重要な点は、ランタイムが要求内のオブジェクトを解決できるようにするために、ビューに関連付けられたViewModelを使用する必要があったことです。
[デフォルトのViewModelオブジェクト以外のオブジェクトをバインドする方法があることは知っていますが、動作させることができなかったため、必要に応じて必要なプロパティを設定するだけでした]
[HttpPost]
public ActionResult GetDataForInvoiceNumber(MyViewModel myViewModel)
{
var invoiceNumberQueryResult = _viewModelBuilder.HydrateMyViewModelGivenInvoiceDetail(myViewModel.InvoiceNumber, myViewModel.SelectedCompanyCode);
return Json(invoiceNumberQueryResult, JsonRequestBehavior.DenyGet);
}
このアクションメソッドを呼び出すために使用されるJQueryスクリプト:
var requestData = {
InvoiceNumber: $.trim(this.value),
SelectedCompanyCode: $.trim($('#SelectedCompanyCode').val())
};
$.ajax({
url: '/en/myController/GetDataForInvoiceNumber',
type: 'POST',
data: JSON.stringify(requestData),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
error: function (xhr) {
alert('Error: ' + xhr.statusText);
},
success: function (result) {
CheckIfInvoiceFound(result);
},
async: true,
processData: false
});