1. 程式人生 > >Asp.Net MVC EF-DbFirst之增刪改查

Asp.Net MVC EF-DbFirst之增刪改查

生成 處的 message mod 更新 get請求 layout 失敗 inf

控制器及動作方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Mvc5Test.Models;
using System.Data.Entity.Infrastructure;

namespace Mvc5Test.Controllers
{
    //用戶的請求總是先發到控制器的某個Action方法,再由Action方法返回對應的視圖
    public class HomeController : Controller
    {
        //數據上下文對象
        BogEntities db = new BogEntities();

        //查詢文章
        public ActionResult Index()
        {
            //SQO標準查詢運算符
            //DbQuery<ClassType> query = db.ClassTypes.Where(ct => ct.ParentID==0) as DbQuery<ClassType>;
            //List<ClassType> ctList = db.ClassType.Where(ct => ct.ParentID == 0).ToList<ClassType>();

            //Linq
            List<Artical> aList = (from a in db.Artical where a.ClassTypeID != 4 select a).ToList();

            //***使用ViewData傳遞數據到視圖
            ViewData["aList"] = aList;

            return View();
        }

        //刪除文章 //此處的默認參數id在App_Start的RouteConfig.cs配置
        public ActionResult Del(int id)
        {
            try
            {
                //1.創建要刪除的對象
                Artical a = new Artical { ID = id };
                //2.將對象添加到EF管理容器
                db.Artical.Attach(a);
                //3.將對象包裝類的狀態標識為刪除
                db.Artical.Remove(a);
                //4.更新數據庫
                db.SaveChanges();
                //5.更新成功,命令瀏覽器跳轉到列表頁
                return RedirectToAction("Index", "Home");
            }
            catch(Exception e)
            {
                return Content("刪除失敗!!!"+e.Message);
            }
        }

        //修改文章-顯示動作
        [HttpGet] //get請求時執行下面這個方法
        public ActionResult Edit(int id)
        {
            //1.根據id查詢數據庫,返回集合中的第一個對象
            Artical a = (from at in db.Artical where at.ID == id select at).FirstOrDefault();

            //2.生成文章分類數據下拉列表集合
            IEnumerable<SelectListItem> selectList = (from ct in db.ClassType 
                                                      select ct).ToList() //從db.ClassType集合中選取元素形成一個新的集合CT
                                                      .Select(ct => new SelectListItem { Value = ct.ID.ToString(), Text = ct.ClassName } //從CT集合中遍歷每個元素,並將遍歷的每個元素轉成SelectListItem對象
                                                      ).ToList();
            //***使用ViewBag傳遞數據到視圖
            ViewBag.CtList = selectList;

            //3.將文章傳遞給視圖
            //***使用View的構造方法,將數據傳給視圖上名為Model的屬性
            return View(a);
        }

        //修改文章-保存動作
        [HttpPost] //post請求時執行下面這個方法
        public ActionResult Edit(Artical model) //此時的model就是頁面中待修改的文章實體對象
        {
            try
            {
                //1.將實體對象加入EF對象容器中,並獲取偽包裝類對象
                DbEntityEntry<Artical> entry = db.Entry<Artical>(model);
                //2.將包裝類對象的狀態設置為unchanged
                entry.State = System.Data.Entity.EntityState.Unchanged;
                //3.設置被改變的屬性
                entry.Property(a => a.Title).IsModified = true;
                entry.Property(a => a.ClassTypeID).IsModified = true;
                //4.提交到數據庫,完成更改
                db.SaveChanges();
                //5.更新成功,則命令瀏覽器重定向到列表頁
                return RedirectToAction("Index","Home");
            }
            catch (Exception e)
            {
                return Content("修改失敗!!!"+e.Message);
            }
        }

        //新增文章-顯示動作
        [HttpGet]
        public ActionResult Add()
        {
            //生成文章分類數據下拉列表集合
            IEnumerable<SelectListItem> selectList = (from ct in db.ClassType
                                                      select ct).ToList() //從db.ClassType集合中選取元素形成一個新的集合CT
                                                      .Select(ct => new SelectListItem { Value = ct.ID.ToString(), Text = ct.ClassName } //從CT集合中遍歷每個元素,並將遍歷的每個元素轉成SelectListItem對象
                                                      ).ToList();
            //***使用ViewBag傳遞數據到視圖
            ViewBag.CtList = selectList;

            return View();
        }

        //新增文章-保存動作
        [HttpPost]
        public ActionResult Add(Artical model)
        {
            try
            {
                //1.將實體對象加入EF對象容器中,並獲取偽包裝類對象
                DbEntityEntry<Artical> entry = db.Entry<Artical>(model);
                //2.將包裝類對象的狀態設置為Added
                entry.State = System.Data.Entity.EntityState.Added;
                //3.提交到數據庫,完成新增
                db.SaveChanges();
                //4.更新成功,則命令瀏覽器重定向到列表頁
                return RedirectToAction("Index", "Home");
            }
            catch (Exception e)
            {
                return Content("新增失敗!!!" + e.Message);
            }
        }
    }
}

首頁數據列表視圖:

@using Mvc5Test.Models;
@{
    Layout = null;
}

<html>
<head>
    <script type="text/javascript">
        function del(id){
            if (confirm("確定要刪除嗎?")) {
                window.location.href = "/home/del/" + id;
            }
        }
    </script>
</head>
<body>
    <table>
        <tr>
            <td>id</td>
            <td>title</td>
            <td>class type</td>
            <td>opration</td>
        </tr>
        @foreach (Artical a in ViewData["aList"] as List<Artical>)
        {
            <tr>
                <td>@a.ID</td>
                <td>@a.Title</td>
                <td>@a.ClassType.ClassName</td> <!--a.ClassType是關聯自ClassType表ID字段的外鍵,EF自動進行外鍵關聯查詢-->
                <td>
                    <a href="javascript:del(@a.ID)">delete</a>
                    <a href="[email protected]
/* */">edit</a> </td> </tr> } <tr> <td colspan="4">@Html.ActionLink("新增文章","Add","Home")</td> </tr> </table> </body> </html>

新增視圖:

@model Mvc5Test.Models.Artical 
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Add</title>
</head>
<body>
    @using (Html.BeginForm("Add", "Home", FormMethod.Post))
    {
        <table>
            <tr>
                <td colspan="2">新增</td>
            </tr>
            <tr>
                <td>標題:</td>
                <!--使用HtmlHelper的強類型方法直接從Model中根據Title屬性生成文本框-->
                <td>@Html.TextBoxFor(a => a.Title)</td>
            </tr>
            <tr>
                <td>分類:</td>
                <!--使用HtmlHelper的強類型方法生成下拉框,並根據Model的ClassTypeID屬性設置默認選中項-->
                <td>@Html.DropDownListFor(a => a.ClassTypeID, ViewBag.CtList as IEnumerable<SelectListItem>)</td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="確定新增" />
                </td>
                <td>
                    @Html.ActionLink("返回", "Index", "Home")
                </td>
            </tr>
        </table>
    }
</body>
</html>

編輯視圖:

@model Mvc5Test.Models.Artical 
<!--以上代碼是指定頁面Model屬性的類型 -->
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Edit</title>
</head>
<body>
    @using (Html.BeginForm("Edit", "Home", FormMethod.Post)) {
        <table>
            <tr>
                <td colspan="2">修改</td>
                @Html.HiddenFor(a => a.ID)
            </tr>
            <tr>
                <td>標題:</td>
                @*<td>@Html.TextBox("Title", (object)Model.Title)</td>*@
                <!--使用HtmlHelper的強類型方法直接從Model中根據Title屬性生成文本框-->
                <td>@Html.TextBoxFor(a => a.Title)</td>
            </tr>
            <tr>
                <td>分類:</td>
                <!--使用HtmlHelper的強類型方法生成下拉框,並根據Model的ClassTypeID屬性設置默認選中項-->
                <td>@Html.DropDownListFor(a=>a.ClassTypeID,ViewBag.CtList as IEnumerable<SelectListItem>)</td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="確定修改" />
                </td>
                <td>
                    @Html.ActionLink("返回","Index","Home")
                </td>
            </tr>
        </table>
    }
</body>
</html>

  

Asp.Net MVC EF-DbFirst之增刪改查