-
處理表單
前面的列子我們已經把表單提交給了HomeControllers類中的RsvpForm動作方法,只是在這個動作方法內,我們並沒有做什么具體的邏輯處理,而是直接返回一個
“Thanks”的視圖。
return View("Thanks", studentResponse);
這個View方法的調用告訴MVC,查找並渲染一個名為“Thanks”的視圖,並把studentResponse對象傳遞給視圖。現在項目中還沒有這個視圖,這里創建Thanks視圖,怎么創建就不用再說了。如下所示
Thanks視圖的代碼如下
@model PartyInvites.Models.StudentResponse @{ Layout = null; } <html> <head> <title>Thanks</title> </head> <body> <p>謝謝您!,@Model.Name!</p> @if (Model.HavingGet==true) { @:很高心您已經收到了錄取通知書! } else { @:不好意思!您還沒有收到錄取通知書!我們會盡快核對,並通知您! } </body> </html>
這里的Thanks視圖使用Razor來顯示基於StudentResponse屬性的內容,這是我們在RsvpForm動作方法中傳遞給視圖的。Razor的@model操作符指示了這個強類型視圖的域模型類型。為了訪問這個域對象中某個屬性的值,我們使用Model.<屬性名>。列如獲得Name屬性的值,調用Model.Name。這里對Razor語法大家肯定會不熟悉,后面我們在來慢慢研究它。
至此我們可以運行這個程序來看一下結果
-
添加驗證
現在,到了把驗證添加到應用程序的時候了。如果不做這件事,用戶可能會出入無意義的數據,甚至遞交一個空白表單。
在MVC應用程序中,驗證被典型地運用於域(模型,MVC中M)模型,而不是在用戶界面上。這意味着,在一個地方定義驗證條件,會在任何運用模型類的地方生效。ASP.NET MVC支持驗證規則聲明,驗證規則是以System.ComponentModel.DataAnnotations命名空間中的注解屬性進行定義的。下面演示了如何把注解的屬性運用於StudentResponse模型類。
using System.ComponentModel.DataAnnotations; namespace PartyInvites.Models { public class StudentResponse { [Required(ErrorMessage = "請輸入您的姓名!")] public string Name { get; set; } [Required(ErrorMessage = "請輸入您的手機號碼!")] public string Mobile { get; set; } [Required(ErrorMessage = "請輸入您的郵箱!")] [RegularExpression(".+\\@.+\\..+", ErrorMessage = "郵箱格式不正確!")] public string Email { get; set; } [Required(ErrorMessage = "請確定您是否已收到錄取通知書!")] public bool? HavingGet { get; set; } } }
如何使用呢?可以在控制器類中使用ModelState.IsValid屬性來檢查是否有驗證問題。如下所示演示了在處理POST的RsvpForm動作方法中如何運用ModelState.IsValid.
[HttpPost] public ViewResult RsvpForm(StudentResponse studentResponse) { if (ModelState.IsValid) { //TODO:發送studentResponse 郵件給學校 return View("Thanks", studentResponse); } else { //有驗證錯誤--重新顯示表單 return View(); } }
如果沒有驗證錯誤,就會同之前那樣,告訴MVC渲染Thanks視圖;如果有驗證錯誤,則通過調用不帶參數的View方法來重新渲染視圖。
我們需要把驗證錯誤信息顯示給用戶,通過在提交表單的視圖中使用Html.ValidationSummary 輔助器方法,如下所示
<body>
@using(Html.BeginForm()){
@Html.ValidationSummary()
<p>您的名字:@Html.TextBoxFor(m => m.Name)</p>
<p>您的郵箱:@Html.TextBoxFor(m => m.Email)</p>
……
}
如果沒有錯誤,這個Html.ValidationSummary方法會在表單中創建一個隱藏的列表條目占位符;否則,MVC會使這個占位符稱為可見,並添加由驗證注解屬性定義的錯誤消息。如下所示
知道我們用於StudentResponse類的所有驗證約束都得到滿足,用戶才會看到Thanks視圖。注意,我們在表單中輸入的數據是被保留的,並且,當帶有驗證摘要的視圖被重新渲染時,被再次顯示出來(這個有點象傳統的ASP.NET Web Form)。這是我們通過模型綁定所得到的好處。
到這里一個簡單的小應用程序基本算是完成了。
通過這幾課的學習,我們對MVC有了大概的了解。