MVC アプリケーションに Ajax 機能を追加しようとしています。フォームを非同期でポストバックしたい。フォームコードは次のとおりです。
using (Ajax.BeginForm("SetInterviewee", "Date", routeValues, new AjaxOptions { UpdateTargetId = "divInterviewee" }))
ドロップダウンリストの選択した値が変更されたときに自動的にポストバックするようにします:
<%= Html.DropDownList("interviewees", Model.interviewees.intervieweeLists.intervieweesList, "-- select employee --", new { @class = "ddltext", style = "width: 200px", onchange = "this.form.submit();" })%>
ただし、これを試してみると、プログラムは期待どおりの部分的なポストバックではなく、正常にポストバックします。問題は次のとおりです。 onchange = "this.form.submit();" ドロップダウンリストで。
これにより、非同期ポストバックではなく、通常のポストバックが何らかの形で発生すると思います。
form タグの HTML 用に MVC が生成するものは次のとおりです。
<form action="/SetInterviewee/2011-1-26/2011-1/visit" method="post" onclick="Sys.Mvc.AsyncForm.handleClick(this, new Sys.UI.DomEvent(event));" onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, updateTargetId: 'divInterviewee' });">
「this.form.submit()」では「onsubmit」イベントハンドラが呼び出されていないと思います。問題は、理由がわかりません。「onsubmit」は、フォームを送信するイベントをキャッチしませんか?
更新:私はjqueryに行きました。
$(function () {
$('#interviewees').change(function () {
var form = $('#intervieweeForm');
$.ajax({
url: form.attr('action'),
type: form.attr('method'),
data: form.serialize(),
success: function (result) {
$('#selectedInterviewee').val(result);
}
});
});
});
これにより、次のような多くの問題が発生しています。
-- 非同期ポストバックはまだ行われていないようです。私のコントローラ アクション メソッドには、次のコードがあります: "if (Request.IsAjaxRequest())" は false を返します。
-- もうモデル バインディングを行うことができないようです。私のルートは次のようになります:
http://localhost:1986/Interviews/2011-2-25/2011-2/visit
しかし、どうやら送信されてしまうルートは
http://localhost:1986/SetInterviewee/2011-2-25/2011-2?
Count=5&Keys=System.Collections.Generic.Dictionary`2+KeyCollection
[System.String,System.Object]
&Values=System.Collections.Generic.Dictionary`2+ValueCollection
[System.String,System.Object]
モデルバインディングが機能しない原因 - 「訪問」は「モード」パラメーターであるはずですが、そこにないため、「モード」はデフォルトで「電話」になり、アップルカート全体が混乱します。
これを引き起こしているのはシリアライズコマンドですか?メソッドが POST のときにクエリ文字列に追加する理由がわかりません。
他にもあります - その中には、アクションが ViewResult を返さなければならないという事実があります。そのため、ajax を使用して必要な文字列を返すにはどうすればよいでしょうか。 /拘束具がまっすぐになりました!
更新:「SetInterviewee」は実際に投稿する正しいルートですが、routeValues パラメーターは現在のビューからルート値をコピーする必要があります。フォームのコードは次のとおりです。
RouteValueDictionary routeValues = ViewContext.RouteData.Values;
using (Html.BeginForm("SetInterviewee", "Date", routeValues, FormMethod.Post, new { id = "intervieweeForm" }))