您的位置:首页 > 其它

爱上MVC3系列~将公用的模块提到PartialView

2012-12-03 23:10 323 查看
回到目录

事实是这样的,这个项目它有产品,用户,用户要买产品,这时产生了订单,而这三个对象都有被评论的功能,这时评论对象Review就产生了,我们要设计一个视图,它来实现对三个对象的评论功能,没有人会希望同样的功能被重复的开发,相同的代码出现的不同的地方,这当然也违背了DRY原则,所以,我们需要抽象,我们需要封装,我们需要对问题进行面向对象的分析. 第一部:将对象抽象出来,找来不变的与变化的属性 product,user,order共同作用于reviews,我们来看一下review的实体结构

/// <summary>
/// 评论对象
/// </summary>
public class Review
{
public long ID { get; set; }
/// <summary>
/// 被评论对象的类型
/// </summary>
public int ObjType { get; set; }
/// <summary>
/// 被评论对象的ID
/// </summary>
public long ObjID { get; set; }
[Required]
public string Title { get; set; }
[Required]
public string Content { get; set; }
[Required]
public DateTime CreateDate { get; set; }
}


/// <summary>
/// 系统主要对象的类型
/// </summary>
public enum ObjectType
{
User,
Product,
Order
}


而事实上,除了ObjType与ObjID之外,其它属性对于三大对象来说都是相同的,这时,我们可给在设计视图时,将objtype与objid以参数的形式告诉review,代码如下:

/// <summary>
/// 评论公用视图
/// </summary>
/// <returns></returns>
public ActionResult Review(int? objID, int? objType)
{
return View(new Review
{
ObjID = objID ?? 0,
ObjType = objType ?? 1,
Content = "",
Title = "",
});
}


最后通过提交表单将objid和objtype的值post到实体中,然后根据objtype来确实操作完成后页面所重定向的地址. 代码如下:

[HttpPost]
public ActionResult Review(Review entity)
{
if (ModelState.IsValid)
{
//数据操作逻辑
//code...
switch (entity.ObjType)
{
case (int)ObjectType.User:
return RedirectToAction("Index", "User", new { id = entity.ObjID });
case (int)ObjectType.Product:
return RedirectToAction("Index", "Product", new { id = entity.ObjID });
case (int)ObjectType.Order:
return RedirectToAction("Index", "Order", new { id = entity.ObjID });
default:
break;
}
}
else
ModelState.AddModelError("", "请认真填写...");
return View();
}


View的代码就不在这里展示了,事实上,我的目的不是代码,不是业务,而是面向对象的思想,通过这个业务,而我自己对面向对象有了新的认识,有时解决问题的方法可能有很多,但我们是否找到的最佳的方法呢? 有时,我们在重复的做一件事,但是否自己意识到了呢?又是否意识到了而去主动寻找更好的方法呢?这些,我希望大家的回答都是"是,我做到了",呵呵.祝您晚安.

回到目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: