私のMVCビューにはボタンがあります:
_<input id="btnSave" type="submit" name="Save" value="Save" />
_
このボタンをクリックすると、1つのアクションを呼び出し、そこで何かを実行してからフォームを送信する必要があります。
私はこのjQueryを持っています:
_$('#btnSave').click(function () {
$.ajax({
url: "/Home/SaveDetailedInfo",
type: "POST",
data: JSON.stringify({ 'Options': someData}),
dataType: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
success: function (data) {
if (data.status == "Success") {
alert("Done");
} else {
alert("Error occurs on the Database level!");
}
},
error: function () {
alert("An error has occured!!!");
}
});
});
_
次に、フォームを送信します。コントローラーには2つのアクションがあります:
_public ActionResult SaveDetailedInfo(Option[] Options)
{
return Json(new { status = "Success", message = "Success" });
}
[HttpPost]
public ActionResult Save()
{
return RedirectToAction("Index", "Home");
}
_
問題は、ボタンに_type="submit"
_が含まれている場合、SaveDetailedInfo
アクションに到達できないためです。ajaxはerror
を提供しますが、_type="submit"
_、ajaxを削除すると正常に動作しますが、Save
アクションは実行されません。
両方のアクションを実行する方法はありますか? _Ajax > Success
_の後にjqueryで_type=submit
_を追加して.click()
を使用しようとしたのかもしれませんが、奇妙に聞こえます。
preventDefault()
を使用して送信ボタンのイベントを停止し、ajax呼び出しでsubmit()
を使用してフォームを送信します。
$('#btnSave').click(function (e) {
e.preventDefault(); // <------------------ stop default behaviour of button
var element = this;
$.ajax({
url: "/Home/SaveDetailedInfo",
type: "POST",
data: JSON.stringify({ 'Options': someData}),
dataType: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
success: function (data) {
if (data.status == "Success") {
alert("Done");
$(element).closest("form").submit(); //<------------ submit form
} else {
alert("Error occurs on the Database level!");
}
},
error: function () {
alert("An error has occured!!!");
}
});
});
ボタンがフォーム内にあると仮定すると、ボタンクリックのデフォルトの動作が妨げられることはありません。つまり、フォーム送信に加えてAJAX呼び出しが行われます。見ることは
したがって、ボタンクリックのデフォルトの動作を防ぐ必要があります
$('#btnSave').click(function (e) {
// prevent the default event behaviour
e.preventDefault();
$.ajax({
url: "/Home/SaveDetailedInfo",
type: "POST",
data: JSON.stringify({ 'Options': someData}),
dataType: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
success: function (data) {
// perform your save call here
if (data.status == "Success") {
alert("Done");
} else {
alert("Error occurs on the Database level!");
}
},
error: function () {
alert("An error has occured!!!");
}
});
});
AJAX urlが「/ Home/Save」ではなく「/ Home/SaveDetailedInfo」を指しているため、C#アクション「Save」は実行されません。
アクション内から別のアクションを呼び出すには、次のソリューションを試すことができます。 link
ここに別のより良い解決策があります: link
[HttpPost]
public ActionResult SaveDetailedInfo(Option[] Options)
{
return Json(new { status = "Success", message = "Success" });
}
[HttpPost]
public ActionResult Save()
{
return RedirectToAction("SaveDetailedInfo", Options);
}
AJAX:
Initial ajax call url: "/Home/Save"
on success callback:
make new ajax url: "/Home/SaveDetailedInfo"