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


    回到目录

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

     1     /// <summary>
     2     /// 评论对象
     3     /// </summary>
     4     public class Review
     5     {
     6         public long ID { get; set; }
     7         /// <summary>
     8         /// 被评论对象的类型
     9         /// </summary>
    10         public int ObjType { get; set; }
    11         /// <summary>
    12         /// 被评论对象的ID
    13         /// </summary>
    14         public long ObjID { get; set; }
    15         [Required]
    16         public string Title { get; set; }
    17         [Required]
    18         public string Content { get; set; }
    19         [Required]
    20         public DateTime CreateDate { get; set; }
    21     }
    1     /// <summary>
    2     /// 系统主要对象的类型
    3     /// </summary>
    4     public enum ObjectType
    5     {
    6         User,
    7         Product,
    8         Order
    9     }

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

     1         /// <summary>
     2         /// 评论公用视图
     3         /// </summary>
     4         /// <returns></returns>
     5         public ActionResult Review(int? objID, int? objType)
     6         {
     7             return View(new Review
     8             {
     9                 ObjID = objID ?? 0,
    10                 ObjType = objType ?? 1,
    11                 Content = "",
    12                 Title = "",
    13             });
    14         }

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

     1         [HttpPost]
     2         public ActionResult Review(Review entity)
     3         {
     4             if (ModelState.IsValid)
     5             {
     6                 //数据操作逻辑
     7                 //code...
     8                 switch (entity.ObjType)
     9                 {
    10                     case (int)ObjectType.User:
    11                         return RedirectToAction("Index", "User", new { id = entity.ObjID });
    12                     case (int)ObjectType.Product:
    13                         return RedirectToAction("Index", "Product", new { id = entity.ObjID });
    14                     case (int)ObjectType.Order:
    15                         return RedirectToAction("Index", "Order", new { id = entity.ObjID });
    16                     default:
    17                         break;
    18                 }
    19             }
    20             else
    21                 ModelState.AddModelError("", "请认真填写...");
    22             return View();
    23         }

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

    回到目录

  • 相关阅读:
    机器学习个人总结
    yolo buffer is too small for requested array
    anaconda + VSCode + 生产环境配置
    YOLO.h5 下载
    通过爬虫程序深入浅出java 主从工作模型
    KafKa记录
    springboot 整合spark-sql报错
    机器学习项目笔记
    python学习笔记之入门
    django-5-使用数据库
  • 原文地址:https://www.cnblogs.com/lori/p/2800526.html
Copyright © 2020-2023  润新知