1. 程式人生 > >DynamicData for Asp.net Mvc留言本例項 中篇 新建.刪除.資料驗證

DynamicData for Asp.net Mvc留言本例項 中篇 新建.刪除.資料驗證

上篇咱完成了顯示列表的功能,下面接著來

也許您有疑問,這個顯示列表不是和正常的Asp.net Mvc差不多嗎?也是個foreach只是由原來的<%=欄位%>變成了<% Html.RenderDynamicField(a, "Title"); %>之流,反倒是多寫了字,除了分頁那裡爽一點以外,其它地方沒見著好處.

下面我們就來看看DynamicData for Asp.net Mvc的好處

前提工作

總有前提工作真是累

這回還是在Application_Start()里加語句,使之成為

protected void Application_Start() {
			RegisterRoutes(RouteTable.Routes);
			var model = new
MetaModel(); model.RegisterContext(typeof(DMvc.Models.DMvcDataDataContext), new ContextConfiguration { ScaffoldAllTables = true }); ModelBinders.DefaultBinder = new DynamicDataModelBinder(ModelBinders.DefaultBinder);//增加複雜引數自動繫結功能 }

插入資料

效果圖(頁面為article/create):

image

這表單,就算是一個讀過我的/Lulu的/哪怕是SBPP的Asp.net Mvc的文章的初學者也可以建出來,但您看看它的View,您就知道DynamicData for Asp.net Mvc的強大了.

            <form method="post">
                <% Html.RenderDynamicEntity<Articles>("art"); %>
                <input type="submit" />
            </form>

就是這樣,強吧

這裡我補充一下它的Controller(簡單明瞭,不多說明了):

       /// <summary>
        /// 用於顯示的頁面
        /// </summary>
[AcceptVerbs(HttpVerbs.Get)] public ActionResult Create() { return View(); } /// <summary> /// 用於接收資料的頁面,僅post訪問 /// </summary> /// <param name="art"></param> [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(Articles art) { using (var db = new DMvcDataDataContext()) { db.Articles.InsertOnSubmit(art); db.SubmitChanges();//插入資料庫並儲存 return RedirectToAction("List");//跳到列表頁 } }

資料驗證

大哥大姐再來看看這效果:

image

就是加一個驗證,看看有多難:

View加了一句:

           <% Html.RenderPartial("ValidationSummary");//加了個這個/不加也可,就是沒有上面的提示了 %>
            <form method="post">
                <% Html.RenderDynamicEntity<Articles>("art"); %>
                <input type="submit" />
            </form>

Controller加了個判斷(Get那沒改只改了post):

        /// <summary>
        /// 用於接收資料的頁面,僅post訪問
        /// </summary>
        /// <param name="art"></param>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(Articles art) {
            try {
                if (ViewData.ModelState.IsValid) {
                    using (var db = new DMvcDataDataContext()) {
                        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();
        }

刪除功能

作為我最喜歡的功能,在一個列表中刪除功能必不可少:

view,我們改動原來的View新增一個刪除按鈕(list中):

	<!--顯示列表開始-->
	<%foreach (var a in ViewData.Model) { %>
	<fieldset>
		<legend>
			<% Html.RenderDynamicField(a, "Title"); %></legend>
		內容:<%Html.RenderDynamicField(a, "Body"); %><br />
		發表日期:<%Html.RenderDynamicField(a, "Addtime"); %>
		作者:<%Html.RenderDynamicField(a, "Author"); %><br />
		
		<form action="<%=Url.Action("Delete")%>" method="post" name="del<%=a.ID %>">
		<%= Html.Hidden("returnTo", Request.RawUrl) %>
		<%= Html.Hidden("id", a.ID) %>
 <input type="submit" value="刪除" />
        </form>
	</fieldset>
	<% } %>
	<!--顯示列表結束-->

我們新增一個刪除的action

        /// <summary>
        /// 刪除資料
        /// </summary>
        /// <param name="id"></param>
        /// <param name="returnTo"></param>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Delete(long id, string returnTo)
        {
            using (var db = new DMvcDataDataContext())
            {
                db.Articles.DeleteOnSubmit(
                    db.Articles.Where(c => c.ID == id).FirstOrDefault())
                    ;
                db.SubmitChanges(); //刪除資料庫並儲存
                return Redirect(returnTo); //跳到列表頁
            }
        }

這樣就可以實現刪除功能了

如果執行以上程式碼時出錯,請檢查UrlRouting規則是否含id,如果有,請去掉:

			routes.MapRoute(
				"Default",                                              // Route name
				"{controller}/{action}",                           // URL with parameters
				new { controller = "Home", action = "Index"}  // Parameter defaults
			);

研究一下,我們會看到,我們只差更新沒有講了,留著下回寫