ASP.NET MVC3 增加、修改和刪除操作執行個體

來源:互聯網
上載者:User

我們再建立一個表,名字命名為"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中還有非常多的特徵,本系列還將會進行介紹。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.