關於EF4.0中多對多關係的添加與修改的解決方案(MVC)

首先在此聲明一下,我不是這方面的高手,也是一個初學者,如果文章中出現不對的地方還請諸位多多指正。
進入正題。
首先我們在數據庫中建三個表
新聞表:News
分類表:Categories
新聞與分類的關係表:NewsInCategories
關係如下:

先在數據庫中預先添加幾個分類:
現在開始添加新聞:
以下是頁面代碼:

@model MvcRelationShipTest.Models.News
@{
    ViewBag.Title = "Create";
}
<h2>
    Create</h2>
<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>News</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Content)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Content)
            @Html.ValidationMessageFor(model => model.Content)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.AddTime)
        </div>
        <div class="editor-field">
            @Html.TextBox("AddTime", DateTime.Now)
            @Html.ValidationMessageFor(model => model.AddTime)
        </div>
        <div class="editor-label">
            @Html.Label("分類")
        </div>
        <div class="editor-field">
            @*Html.CheckBoxFor(Model => Model.Categories)*@
            @{Html.RenderAction("ChcekList", "Categories");}
        </div>
        <p>
            <input type="submit" value="添加" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

CheckList的View:
@model IEnumerable<MvcRelationShipTest.Models.Categories>
<ul>
    @foreach (var item in Model)
    {
        <li>
            <label for="@item.Id">@item.Name</label>
            <input type="checkbox" name="CategoryId" value="@item.Id" id="@item.Id"/>
        </li>        
    }
</ul>
添加頁面沒什麼特別的。

News的Control部分:
        //GET
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Models.News model)
        {

            try
            {
                var t = Request["CategoryId"];//獲取選中的分類ID格式爲("1,2,3”)不包含括號。
                using (var db = new dbContent())
                {
                    if (t != null)
                    {
                        List<Int32> idlist = StringToIntList(t);//將傳來的分類ID轉成List<int>
                        var cate = db.Categories.Where(p => idlist.Contains(p.Id));
                        foreach (var item in cate)
                        {
                            model.Categories.Add(item);//給新聞添加分類
                        }
                    }
                    db.News.AddObject(model);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch (Exception ex)
            {
                var y = ex.InnerException;
                return View(model);
            }

        }

以上是添加新聞的頁面代碼。
現在修改新聞
Edit View的代碼:
@model MvcRelationShipTest.Models.News
@{
    ViewBag.Title = "Edit";
}
<h2>
    Edit</h2>
<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>News</legend>
        @Html.HiddenFor(model => model.Id)
        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Content)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Content)
            @Html.ValidationMessageFor(model => model.Content)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.AddTime)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AddTime)
            @Html.ValidationMessageFor(model => model.AddTime)
        </div>
        <div class="editor-label">
            @Html.Label("分類")
        </div>
        <div class="editor-field">
            <ul>
                @*綁定分類,如果是以選擇的 則加載時讓他的狀態爲checked*@
                @{List<MvcRelationShipTest.Models.Categories> list = (ViewBag.Categories as List<MvcRelationShipTest.Models.Categories>);
                  foreach (var item in list)
                  {
                    <li>
                        <label for="@item.Id">@item.Name</label>
                        @if (Model.Categories.Contains(item))
                        {
                            <input type="checkbox" name="CategoryId" value="@item.Id" id="@item.Id" checked="checked" />
                        }
                        else
                        {
                            <input type="checkbox" name="CategoryId" value="@item.Id" id="@item.Id" />
                        }
                    </li>
                  }
                   
                }
            </ul>
            @*Action("ChcekList", "Categories")*@
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Controller部分的代碼:
public ActionResult Edit(int id)
        {
            var db = new dbContent();
            ViewBag.Categories = db.Categories.ToList();

            var model = db.News.Where(n => n.Id == id).FirstOrDefault();
            return View(model);
        }

        [HttpPost]
        public ActionResult Edit(int id, Models.News model)
        {
            try
            {
                model.Id = id;
                var t = Request["CategoryId"];
                using (var db = new dbContent())
                {
                    if (t != null)
                    {
                        List<Int32> idlist = StringToIntList(t);
                        //新的分類
                        var cate = db.Categories.Where(p => idlist.Contains(p.Id)).ToList();
                        //原來的分類
                        var olist = model.Categories.AsQueryable();
                        //要刪除的分類
                        var dlist = olist.Where(p => !cate.Contains(p)).ToList();
                        //要添加的分類
                        var alist = cate.Where(p => !olist.Contains(p)).ToList();
                        foreach (var item in dlist)
                        {
                            model.Categories.Remove(item);
                        }
                        foreach (var item in alist)
                        {
                            model.Categories.Add(item);
                        }
                    }
                    else
                    {
                        model.Categories.Clear();
                    }

                    db.ObjectStateManager.ChangeObjectState(model, EntityState.Modified);
                    db.SaveChanges();
                }
                return RedirectToAction("index");
            }
            catch (Exception ex)
            {
                var t = ex.InnerException;
                var db = new dbContent();
                ViewBag.Categories = db.Categories.ToList();
                return View(model);
            }
        }
好了,修改也完成了。
現在分析一下,其實最關鍵的就是你要把你選擇的分類ID以("1,2,3,4,5,9")的方式傳到後臺。
後臺在根據這個分類ID獲取分類,然後添加到新聞中,跟web的處理有點類似。
看一下最後的成果,嘻嘻!

想要demo的朋友請加QQ羣:63181865索取。
到此結束。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章