虽然也许这样并不符合其语义,但我仍想这么做,因为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>
<% } %>
这里我们将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();
}
本文示例源代码或素材下载