1. 程式人生 > >DynamicData for Asp.net Mvc留言本例項 下篇 更新

DynamicData for Asp.net Mvc留言本例項 下篇 更新

我並不打算再建一個edit頁來實現更新,而打算用現有的create頁來實現更新功能

雖然也許這樣並不符合其語義,但我仍想這麼做,因為asp那時候大家都是把增刪改查放在一個頁面的只用引數來區別

如:

article?m=add

article?m=modfiy

article?m=delete

由於控制元件的流行,細節被Asp.net隱匿了起來,很多朋友不再通過QueryString或隱藏表單來控制功能,或者未接觸過Asp的朋友從來也沒有想過這麼做,因為GridView等控制元件提供了增刪功能.

但是Asp.net Mvc下我們是否應該重新認識一下這種些基礎的東西呢

因為一個朋友剛剛問了我一個關於通過QueryString來區分Add/Edit的問題,所以感觸挺多,囉嗦幾句,大家見諒

而我這裡為了不破壞前面所講的結構所以只能將錯就錯一下,為Create新增一個id的可空引數,如果id為空即為新增,如果有id的值傳過來就是編輯

OK開動.

首先在列表中先加一個修改的連線

	<!--顯示列表開始-->
	<%foreach (var a in ViewData.Model) { %>
	<fieldset>
		<legend>
			<% Html.RenderDynamicField(a, "Title"); %></legend>
//....
        <%=Html.ActionLink("修改","Create",new{id=a.ID},null) %>
</fieldset> <% } %>

image

這裡我們將id傳了過去

在create頁我們將view修改一下:

            <form method="post">
                <%
              Html.RenderDynamicEntity("art", ViewData.Model
                                       ,
                                       ViewData.Model == null ? DataBoundControlMode.Insert : DataBoundControlMode.Edit); %>
<input type="submit" /> </form>

這樣view頁就可以自動生成新增或修改的表單,而其判斷依據是ViewData.Model是否存在值

我們在Controller中對id進行判斷,如果存在則給ViewData.Model賦值

        /// <summary>
        /// 用於顯示的頁面
        /// </summary>
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Create(long? id)
        {
            if(id.HasValue)
            {
                using (var db = new DMvcDataDataContext())
                {
                    var art=db.Articles.Where(c => c.ID == id.Value).FirstOrDefault();
                    return View(art);
                }
            }
            return View();
        }

同樣,我們在它的處理Action也做一個判斷

/// <summary>
        /// 用於接收資料的頁面,僅post訪問
/// </summary>
/// <param name="id"></param>
/// <param name="art"></param>
/// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(long? id,Articles art) {
            try {
                if (ViewData.ModelState.IsValid) {
                    using (var db = new DMvcDataDataContext()) {
                        if (id.HasValue) {
                            //在存在id時修改資料
                            var a = db.Articles.Where(c => c.ID == id).FirstOrDefault();
                            a.Title = art.Title;
                            a.Body = art.Body;
                            a.Author = art.Author;
                            a.AddTime = art.AddTime;
                        }
                        else {//不存在id時新增資料
                            db.Articles.InsertOnSubmit(art);
                        }
                        db.SubmitChanges();
                        return RedirectToAction("List");
                    }
                }
            }
            catch (Exception ex) {
                ModelState error = new ModelState();
                error.Errors.Add(ex);
                ViewData.ModelState.Add("Category", error);
            }
            return View();
        }

這樣我們就有了一個同時兼備修改和新增功能的頁面.