首先在此聲明一下,我不是這方面的高手,也是一個初學者,如果文章中出現不對的地方還請諸位多多指正。
進入正題。
首先我們在數據庫中建三個表
新聞表: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索取。
到此結束。