我們再建立一個表,名字命名為"Contact",開啟"AndroidDB.edmx"檔案,右鍵選擇"從資料庫更新模型"。這個前邊已經介紹過,這裡就不多說,這樣在實體層就建立了"Contact"類及它的屬性。接下來,我們新添加一個名為"ContactController"的控制器類,用來顯示我們的留言表單並實現留言功能。我們先看看Controller中的代碼,如下:
| 代碼如下 |
複製代碼 |
public class ContactController : Controller { Android.Models.AndroidEntities android = new AndroidEntities(); // // GET: /Contact/ public ActionResult Create() { return View(); } // // POST: /Contact/Create [HttpPost] public ActionResult Create(Contact contact) { if (ModelState.IsValid) { android.AddObject("Contact", contact); android.SaveChanges(); return RedirectToAction("../Home"); } else { return View(contact); } } } |
上邊這些代碼就是 Controller 中所需的所有代碼了,非常簡潔,是吧?需要說明的2點是:1.[HttpPostAttribute]表明了只有當表單提交方式為"Post"時,才執行第二個方法,其他情況下執行第一個Create()方法。2.我們使用類 ObjectContext 的方法AddObject()方法進行添加操作,參數分別是屬性名稱和實體,AddToContact()這種方法現在已經棄用了,這點我們需要注意下。關於使用ObjectSet屬性可以參考下ASP.NET MVC3 執行個體(三) 使用 Controller 進行資料的的查詢。
接下來我們添加 View 模板,用來展示留言表單,在Create()方法上按右鍵,Add View,如下圖:
我們分別選擇了 View data class 為"Contact",模板為"Create",得到如下的 View:
| 代碼如下 |
複製代碼 |
@model Android.Models.Contact <body> <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Contact</legend> <div class="editor-label"> @Html.LabelFor(model => model.UserName) </div> <div class="editor-field"> @Html.TextBoxFor(model => model.UserName) @Html.ValidationMessageFor(model => model.UserName) </div> <div class="editor-label"> @Html.LabelFor(model => model.Email) </div> <div class="editor-field"> @Html.TextBoxFor(model => model.Email) @Html.ValidationMessageFor(model => model.Email) </div> <div class="editor-label"> @Html.LabelFor(model => model.Website) </div> <div class="editor-field"> @Html.TextBoxFor(model => model.Website) @Html.ValidationMessageFor(model => model.Website) </div> <div class="editor-label"> @Html.LabelFor(model => model.Content) </div> <div class="editor-field"> @Html.TextAreaFor(model => model.Content,5,60,"Content") @Html.ValidationMessageFor(model => model.Content) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } </body> |
這種寫法在 ASP.NET MVC 2 裡就已經有了,並沒有太多可說的,它使用強型別的 HtmlHelper 方法輸出相應的 HTML 的標記。看留言內容那裡,可知我們可以定義輸入框的大小和ID(Name),非常方便。到這裡,我們就已經完成了 ASP.NET MVC 3 中的添加操作。當使用者點擊"Create"按鈕時,表單中的資料會自動正確的賦給對應的屬性。
我們要時刻記得“使用者的輸入是邪惡的”,這樣我們要對使用者的輸入進行必要的驗證。實體層資料驗證的改進也是 MVC 3 中的一大亮點。@Html.ValidationSummary(true)表明我們已經啟用了用戶端的非同步驗證,很明顯這樣可以減少不必要的伺服器請求,MVC3中微軟全面使用 jQuery 進行用戶端的驗證。
ASP.NET MVC3中實體資料的驗證是非常簡單的,商務邏輯分離的非常好,如在驗證留言內容時,只需添加如下代碼:
| 代碼如下 |
複製代碼 |
[Required(ErrorMessage="不可為空")] [StringLength(1000, ErrorMessage = "長度在5-1000", MinimumLength = 5)] public global::System.String Content { get { return _Content; } set { OnContentChanging(value); ReportPropertyChanging("Content"); _Content = StructuralObject.SetValidValue(value, true); ReportPropertyChanged("Content"); OnContentChanged(); } } |
分別驗證了必填和長度兩個屬性,還有很多屬性,我們就不做一一介紹了。最後看下結果,如下:
下邊就讓我們在此基礎上來完成 ASP.NET MVC3 中的修改和刪除操作。
首先,我們在 Contact 控制器類中添加一個名為 View()的方法,用來從 Contact 表中取出留言資料,並傳遞給列表頁 "Index",方法如下:
| 代碼如下 |
複製代碼 |
// // GET: /Contact/ public ActionResult Index() { var contact = from c in android.Contact where c.IsValid == 1 orderby c.ID descending select c; return View(contact.ToList()); } |
我們使用 Linq 從 Contact 表中取出了所有有效資料(IsValid==1),並按ID降序顯示。接下來,添加名為"Index"的視圖,最終 "Index" 全部代碼如下:
| 代碼如下 |
複製代碼 |
@model IList<Android.Models.Contact> <p> @Html.ActionLink("Create New", "Create") </p> <table> <tr> <th> UserName </th> <th> Content </th> <th> Addtime </th> </tr> @foreach (var item in Model) { <tr> <td> @item.UserName </td> <td> @item.Content </td> <td> @item.Addtime </td> <td> @Html.ActionLink("編輯", "Edit", new { id=item.ID }) | @Html.ActionLink("刪除", "Delete", new { id = item.ID }) </td> </tr> } </table> |
可以看到,顯示用的代碼是非常整潔的,我們沒有做樣式方面的美化,最終的列表頁效果如下:
修改操作、刪除操作傳遞的參數都是留言ID,首先,我們看看修改操作,分別給 "Contact" Controller 添加名為 Edit() 兩個方法,1.用來根據根據ID得到留言實體,並返回給編輯頁;2.完成修改操作。如下:
| 代碼如下 |
複製代碼 |
// // GET: /Contact/Edit/5 public ActionResult Edit(int id) { var message = android.Contact.Single(m => m.ID == id); return View(message); } // // POST: /Contact/Edit/5 [HttpPost] public ActionResult Edit(int id, FormCollection collection) { try { var message = android.Contact.Single(m => m.ID == id); UpdateModel(message); android.SaveChanges(); return RedirectToAction("Index");//返回到列表 } catch { return View(); } } |
為了簡潔起見,修改時我們只修改留言是否有效,其他的和這個類似,"Edit"視圖最終代碼如下:
| 代碼如下 |
複製代碼 |
@model Android.Models.Contact @using (Html.BeginForm()) { <fieldset> <legend>Contact</legend> @Html.HiddenFor(model => model.ID) <div class="editor-label"> @Html.LabelFor(model=>model.Content,"留言內容") </div> <div class="editor-field"> @Model.Content </div> <div class="editor-label"> @Html.LabelFor(model => model.IsValid,"是否有效") </div> <div class="editor-field"> 有效 @Html.RadioButtonFor(model=>model.IsValid,1) 無效 @Html.RadioButtonFor(model=>model.IsValid,0) </div> <p> <input type="submit" value="Save" /> </p> </fieldset> }
|
頁面的效果如下圖所示:
其中RadioButtonFor同LabelFor使用方法類似,這樣當我們點擊列表頁中的"編輯"時,先執行第一個"Edit"方法,根據ID將實體返回到我們的編輯頁。當我們點擊"Save"提交時,執行第二個"Edit"方法,並對資料庫中的"Contact"表進行了修改操作,這樣實現了在 ASP.NET MVC3 中的修改操作。
下邊看看刪除操作,"Contact" 控制器類中的刪除方法只使用 Get 方式的就行,因為我們將根據傳遞過來的ID直接進行刪除操作,如下:
| 代碼如下 |
複製代碼 |
// // GET: /Contact/Delete/5 public ActionResult Delete(int id) { try { var contact = android.Contact.Single(c => c.ID == id); android.DeleteObject(contact); android.SaveChanges(); } catch { } return RedirectToAction("../Contact"); } |
當然了此時的"Delete" 視圖完全為空白也是可以的。刪除操作執行後返回到我們的留言列表中,到這裡刪除操作就完成了。這裡使用真刪除是為了說明DeleteObject()方法,一般這種情況我們只需將"IsValid"欄位修改為0即可,並不做真刪除。還有一點要注意的是,例子中使用try進行異常的處理,因為 Linq 查詢時會在有問題時拋出相應的異常、SaveChanges()也會拋出異常。
從這兩篇文章我們不難發現,在 ASP.NET MVC3中我們不再需要手動寫代碼來接收參數了,你可以在添加、修改操作中看到我們並沒有手動寫代碼來接收以"Post"方式提交過來的表單資料。如果你看的 MVC 3中的有些文章還在使用Request["parameter"]、Request.Form["parameter"]、Request.QueryString["parameter"]、collection["parameter"](collection 是 FormCollection 類對象)的方式接收參數,你就需要注意下了。當然,ASP.NET MVC3中還有非常多的特徵,本系列還將會進行介紹。