記錄著在ASP.NET MVC中
如何使用Ajax.BeginForm達到Submit form時
僅改變部份畫面 而不是整頁Request、Response
必要套件 : https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/
畫面會分成三個步驟 1.輸入頁 2.確認頁 3.結果頁
首先在View中 第一頁是一個完整個View, 二三頁則為partial view
因此第一頁要設定layout, 二三頁的layout則為null
First page :
@model InputPageViewModel
@section scripts {
@* 引用此js才可使用Ajax.BeginForm *@
<script src="@Url.Content("~/Content/js/jquery.unobtrusive-ajax.min.js")"></script>
<script type="text/javascript">
// 驗證
function verify() {
}
// 導頁前動作
function hideFirstPage() {
$("#divInput").hide();
$("#divConfirm").show();
$("#divResult").hide();
}
</script>
}
@* 初始輸入頁 *@
<div id="divInput">
@using (Ajax.BeginForm("ConfirmAction", "Home", new AjaxOptions()
{
HttpMethod = "Post",
UpdateTargetId = "divConfirm",
InsertionMode = InsertionMode.Replace,
OnBegin = "verify",
OnComplete = "hideFirstPage"
// OnSuccess = "onSuccess(data, status, xhr)",
// OnFailure = "onFailure(xhr, status, error)"
}, new { @id = "inputForm" }))
{
@* your html in form *@
}
</div>
@* 確認頁面 *@
<div id="divConfirm">
</div>
@* 結果頁 *@
<div id="divResult">
</div>
UpdateTargerId - 設定接到Response後的資料要放在哪個區塊內, 此範例後端會將輸入的資料整理成確認頁後回傳回來, 將接收到的資料放入divConfirm內
OnBegin - 可以設定在Form被Submit前 先執行的一段js function, 可以用來做一些前端的檢查, 檢查通過(return true)時Form才會真的被submit到後端Controller
OnComplete - 可以在收到後端的Response後 執行一段js function, 此範例是將divInput隱藏/divConfirm顯示
Second page :
@model ConfirmPageViewModel
@{
Layout = null;
}
<script>
$(document).ready(function () {
$('#btnConfirm').click(function () { $('#confirmForm').submit(); });
})
// 返回前動作
$(document).on("click", "#btnBack", function () {
$("#divInput").show();
$("#divConfirm").hide();
$("#divResult").hide();
});
// 導頁前動作
function hideConfirmPage() {
$("#divInput").hide();
$("#divConfirm").hide();
$("#divResult").show();
}
</script>
@using (Ajax.BeginForm("ResultAction", "Home", null, new AjaxOptions()
{
HttpMethod = "Post",
UpdateTargetId = "divResult",
InsertionMode = InsertionMode.Replace,
// OnBegin = "verify",
OnComplete = "hideConfirmPage"
// OnSuccess = "onSuccess(data, status, xhr)",
// OnFailure = "onFailure(xhr, status, error)"
}, new { @id = "confirmForm" }))
{
<!-- two buttons : back and confirm -->
<a id="btnBack" href="javascript:void(0);" class="c-btn c-btn--secondary" data-history-back>
<span>Back</span>
</a>
<a id="btnConfirm" href="javascript:void(0);" class="c-btn c-btn--primary">
<span>Confirm</span>
</a>
}
Result page :
@model ResultPageViewModel
@{
Layout = null;
}
<script>
</script>
@* Your html in result page *@
二三頁的Html會分別放入第一頁的divConfirm, divResult
因此不需要Layout, 只要放入要顯示的資料就部分的Html即可