// View: Release.aspx
<%= Html.TextBox("Title") %>
<%= Html.ValidationMessage("TitleValidator") %>
<%= Html.TextArea("Content") %>
<%= Html.ValidationMessage("ContentValidator") %>
// Controller
[HttpPost]
public ActionResult DoRelease(AnnounceInfo model) {
if (string.IsNullOrEmpty(model.Title))
ModelState.AddModelError("TitleValidator", "標題必填");
if (string.IsNullOrEmpty(model.Content))
ModelState.AddModelError("ContentValidator", "內容必填");
if (!ModelState.IsValid) return View("Release", model); // 同步回傳 View
_service.Create(model);
return RedirectToAction("Index"); // PRG
}
Ajax.BeginForm、AjaxOptions 設定 UpdateTargetId、OnSuccess 等。MicrosoftMvcAjax.js。<input type="text" id="Title" name="Title" />
<span id="TitleError" class="error"></span>
<textarea id="Content" name="Content"></textarea>
<span id="ContentError" class="error"></span>
<button id="btnSubmit">發布</button>
<script src="jquery.js"></script>
<script>
$("#btnSubmit").click(function() {
$.post("/Announce/DoReleaseAjax", { Title: $("#Title").val(), Content: $("#Content").val() }, function(result) {
if (result.Success) {
window.location = result.RedirectUrl; // PRG
} else {
$("#TitleError").text(result.Errors.Title || "");
$("#ContentError").text(result.Errors.Content || "");
}
}, "json");
});
</script>
public ActionResult DoReleaseAjax(string Title, string Content) {
var errors = new Dictionary();
if (string.IsNullOrEmpty(Title)) errors["Title"] = "標題必填";
if (string.IsNullOrEmpty(Content)) errors["Content"] = "內容必填";
if (errors.Count > 0)
return Json(new { Success = false, Errors = errors });
_service.Create(new AnnounceInfo { Title = Title, Content = Content });
return Json(new { Success = true, RedirectUrl = Url.Action("Index") });
}
| 維度 | 同步 + ModelState | ASP.NET AJAX | jQuery + JSON |
|---|---|---|---|
| 程式碼量 | 少 | 中 | 中(View 較多) |
| 使用者體驗 | 整頁重載 | 局部更新 | 局部更新、流暢 |
| 前端相依 | 無 | MicrosoftMvcAjax.js | jQuery |
| 測試容易度 | 高 | 中 | 高(Controller 純 JSON) |
| 現代程度 | 基礎 | 過時 | 標準 |
IValidator 服務,Action 僅協調。{ Success, Errors: { field: message }, RedirectUrl }。jquery.validate.unobtrusive 實現客戶端預驗證,減少伺服器負載。MVC + jQuery AJAX 讓非同步表單驗證變得簡單、可測試、體驗優異,是現代 Web 開發的標準範式。