asp.net mvc(一)

这些天开始学习asp.net mvc,用传统的asp.net已经快四的年了,刚开始接触asp.net mvc确认感觉有点不适应,主要体现在asp.net mvc的实现上。

问题一:要想学习asp.net mvc,我个人觉的最重要的一步是知道mvc路由机制,传统的asp.net程序要想访问一个页面,都是根据页面路径来访问,但MVC并不能直接访问aspx页面。

问题二:理解MVC三部分的含义和用法。当我们创建一个asp.net mvc应用程序时,系统会默认生成三个文件夹: 
               1:Controllers,对应MVC中的C,主要是处理所有请求与做出对应的响应;  
               2:Models,对应MVC中的M,相当时我们平时创建工程中的实体工程,只不过在MVC中它充当了存放数据模型的作用;
               3:Views,对应MVC中的V,这里就是存放用户访问的页面文件,但是这个文件不能在浏览器中根据路径访问。
    对于系统生成的asp.net mvc项目,我对其做了如下扩展:

扩展点一:系统之所以在web工程中直接创建了三个文件夹,是为了更加直观的体现MVC模式,真正项目中我们需要把它们分开。

扩展点二:MVC中重要的路由处理,默认情况是在Global.asax文件中,我们也可以把这块内容独立出来。

扩展点三:把Controller类和业务逻辑分离,这里可以采用Repository模式。

案例DEMO:创建一个简单的留言簿的项目,数据存储采用sql,本想用linq to entity,但总觉的这部分还相关不完善,且性能存在问题,故使用传统ado.net实现数据存储。下面是这个项目的分层。

1:GuestBook.Web,页面表示层  ,MVC中的V。

2:GuestBook.MVC.Controller,存放项目所有的Controller,MVC中的C。我们知道Controller有两个作用:第一,处理请求;第二,做出对应的响应。第二点就是我们平时理解的后台功能实现,例如数据的增删改查等。我们可以把这部分功能与Controller分离,即所有的业务逻辑都写在业务逻辑层,不直接依赖Controller,我们可以进一步把这些功能点抽象出来,让Controller依赖一个公共的接口。这个思想我之前的一篇文章有点异曲同工之处:对增删改查用面向对象进行包装

首先:创建一个Repository接口:IRepository.cs,里面包含些常见数据处理操作方法:这个接口是一个泛型接口,以实现所有实体类的通用性。

  1. public interface IRepository<T>
  2. {
  3. List<T> FindAllInfo();
  4. T GetInfo(T model);
  5. bool Add(T model);
  6. bool Delete(T model);
  7. bool Edit(T model);
  8. }

然后:实现一条留言的数据处理:

  1. public List<GuestBookInfo> FindAllInfo()
  2. {
  3. string sql = "select * from GuestBook";
  4.  
  5. List<GuestBookInfo> list = new List<GuestBookInfo>();
  6. using(SqlDataReader dr=SqlHelper .ExecuteReader (conn ,CommandType .Text ,sql ))
  7. {
  8. while (dr.Read())
  9. {
  10. GuestBookInfo model = new GuestBookInfo();
  11. model.ID = int.Parse (dr["ID"].ToString());
  12. model.sTitle = dr["sTitle"].ToString();
  13. model.sContent = dr["sContent"].ToString();
  14. list.Add(model);
  15. }
  16.  
  17. }
  18. return list ;
  19. }
  20. public GuestBookInfo GetInfo(GuestBookInfo model)
  21. {
  22. string sql = "select * from GuestBook where ID="+model.ID .ToString ();
  23. using (SqlDataReader dr = SqlHelper.ExecuteReader(conn, CommandType.Text, sql))
  24. {
  25. if (dr.Read())
  26. {
  27. model.ID = int.Parse(dr["ID"].ToString());
  28. model.sTitle = dr["sTitle"].ToString();
  29. model.sContent = dr["sContent"].ToString();
  30.  
  31. }
  32.  
  33. }
  34. return model ;
  35. }
  36. public bool Add(GuestBookInfo model)
  37. {
  38. string sql = "insert into GuestBook (sTitle,sContent) values ('" + model.sTitle + "','" + model.sContent + "')";
  39. int i = SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sql);
  40. if (i > )
  41. { return true; }
  42. return false ;
  43. }
  44. public bool Delete(GuestBookInfo model)
  45. {
  46. string sql = "delete GuestBook where ID=" + model.ID.ToString();
  47. int i = SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sql);
  48. if (i > )
  49. { return true; }
  50. return false;
  51. }
  52. public bool Edit(GuestBookInfo model)
  53. {
  54. string sql = "update GuestBook set sTitle='" + model.sTitle + "',sContent='" + model.sContent + "' where ID=" + model.ID.ToString();
  55. int i = SqlHelper.ExecuteNonQuery(conn, CommandType.Text, sql);
  56. if (i > )
  57. { return true; }
  58. return false;
  59. }
  60.  

其实:Controller依赖IRepository接口。

  1. public class GuestBookController : System.Web.Mvc.Controller
  2. {
  3. IRepository<GuestBookInfo> inter = new BLL_GuestBook();
  4. public ActionResult Index()
  5. {
  6. var models = inter.FindAllInfo();
  7. return View("Index", models);
  8. }
  9. [AcceptVerbs(HttpVerbs.Post)]
  10. public ActionResult Create(GuestBookInfo model)
  11. {
  12.  
  13. inter.Add(model );
  14. return RedirectToAction("Index");
  15. }
  16. public ActionResult Create()
  17. {
  18. GuestBookInfo model = new GuestBookInfo();
  19. return View(model );
  20. }
  21. public ActionResult Details(int id)
  22. {
  23.  
  24. GuestBookInfo model=new GuestBookInfo ();
  25. model .ID =id;
  26. model =inter.GetInfo (model );
  27. if (string .IsNullOrEmpty (model.sTitle ))
  28. { return View("NotFound"); }
  29. else
  30. {
  31. return View("Details",model );
  32. }
  33. }
  34. public ActionResult Edit(int id)
  35. {
  36. GuestBookInfo model = new GuestBookInfo();
  37. model.ID = id;
  38. model = inter.GetInfo(model);
  39. if (string.IsNullOrEmpty(model.sTitle))
  40. { return View("NotFound"); }
  41. else
  42. {
  43. return View("Edit", model);
  44. }
  45. }
  46. [AcceptVerbs(HttpVerbs.Post)]
  47. public ActionResult Edit(int id, FormCollection formValues)
  48. {
  49. GuestBookInfo model = new GuestBookInfo();
  50. model.ID = id;
  51. model = inter.GetInfo(model);
  52. UpdateModel(model );
  53. inter.Edit(model);
  54. return RedirectToAction("Index");
  55. }
  56. public ActionResult Delete(int id)
  57. {
  58. GuestBookInfo model = new GuestBookInfo();
  59. model.ID = id;
  60. model = inter.GetInfo(model);
  61. if (model == null)
  62. return View("NotFound");
  63. inter.Delete(model);
  64. return RedirectToAction("Index");
  65. }
  66.  
  67. }

3:GuestBook.Model,MVC中的M。

4:GuestBook.RouteManager,路由管理项目,把路由处理从Global.asax中分离开。我们创建一个新类:MyMvcAppliation.cs

  1. public class MyMvcAppliation:HttpApplication
  2. {
  3. public static void RegisterRoutes(RouteCollection routes)
  4. {
  5. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  6.  
  7. routes.MapRoute(
  8. "Default", // Route name
  9. "{controller}/{action}/{id}", // URL with parameters
  10. new { controller = "Home", action = "Index", id = "" }, // Parameter defaults
  11. new string[] { "GuestBook.MVC.Controller" }
  12. );
  13.  
  14. }
  15.  
  16. protected void Application_Start()
  17. {
  18. ControllerBuilder.Current.DefaultNamespaces.Add("GuestBook.MVC.Controller");
  19. RegisterRoutes(RouteTable.Routes);
  20. }
  21. }

5:GuestBook.Data,数据处理工具类,例如SqlHelp等等。

6:GuestBook.DAL,数据处理层。

7:GuestBook.BLL,业务逻辑层。

8:GuestBook.MyInterface,相关接口,本项目中包含Repository模式中的接口类。

asp.net mvc(一) ----------简单封装成通用的List<T>集合的更多相关文章

  1. asp.net mvc 自定义pager封装与优化

    asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...

  2. [ASP.net MVC] 将HTML转成PDF档案,使用iTextSharp套件的XMLWorkerHelper (附上解决显示中文问题)

    原文:[ASP.net MVC] 将HTML转成PDF档案,使用iTextSharp套件的XMLWorkerHelper (附上解决显示中文问题) [ASP.net MVC] 将HTML转成PDF档案 ...

  3. asp.net mvc 实现简单的实时消息推送

    因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket  Ajax的轮回.当然此 ...

  4. ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。

    准备工作: 在vs工具栏中找到NuGet 下载DotNetZip 现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. public ActionResult Export() ...

  5. ASP.NET MVC中简单使用Autofac

    项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control.控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度. 示例代码: IPro ...

  6. ASP.NET MVC 搭建简单网站 --1.前端页面布局和基本样式实现

    学技术这件事儿本来就是学习现有的东西,然后变成自己的,本文当然也是借鉴的别人的东西,写出来作为一个对知识的巩固.  1.网站用的是MVC模式,新建一个MVC项目,建立一个APP1Controller, ...

  7. asp.net mvc Htmlhelper简单扩展

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. asp.net mvc 最简单身份验证 [Authorize]通过的标准

    [Authorize] public ContentResult Index2() { return Content("验证通过了"); } 经常能够看到某个Controler下的 ...

  9. ASP.NET MVC 实现简单的登录

    1.创建一个控制器   如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

随机推荐

  1. 关于Random中的随机数种子Seed

    Random初始化的时候,可以以一个INT32作为参数,称为seed,MSDN上的解释是:“伪随机数是以相同的概率从一组有限的数字中选取的......随机数的生成是从种子值开始......” 所有标准 ...

  2. Asp.Net之后台载入JS和CSS

    在Asp.Net开发时,用到的JS库.通用的CSS等,在很多页面都会用到,而每次都须要手动引入.相当麻烦.并且有时一旦忘了引用,还得找半天才干找到问题.那有没有什么办法可以一劳永逸的呢?答案是有的. ...

  3. C++多线程环境下注意共享资源的释放顺序

    比如我现在写一个多线程下载程序,包含DownloadTask.HttpDownload两个类. class DownloadTask { //省略n行代码 public: int m_threads; ...

  4. php 输出带变量字符串(echo 函数的应用)

    转自:  http://www.cnblogs.com/devcjq/articles/2306150.html 学习PHP从最简单的开始:echo, print<?php$temp = arr ...

  5. 新兵训练营课程——环境与工具Java[转]

    原文地址:http://weibo.com/p/1001643874239169320051 程序员在开发过程中会用到很多工具来提升开发和协作效率,这次介绍的是目前微博平台在开发过程中用到的一些工具, ...

  6. CleanMyMac 4破解版-最强中文版_破解版_激活码_注册码

    最新版CleanMyMac 4中文版本已经发布了,也受到了广大用户的喜爱.众所周知, 注册码是开启软件的钥匙,在获取软件安装包之后需要有效的注册码才能激活软件.但是关于CleanMyMac 4注册码的 ...

  7. Unity获取指定资源目录下的所有文件

    使用前需要引入System.IO;这个命名空间 public void GetFiles() { //路径 //string path = string.Format("{0}", ...

  8. error C2275: 'SOCKET' : illegal use of this type as an expression

    在VC中编译xxx.c文件出现错误error C2275 illegal use of this type as an expression 问题在于C99之前要求所有的声明必须放在函数块的起始部分, ...

  9. html5 经验记录 持续更新

    1 关于page cache 由于移动端浏览器webkit基本都实现了page cache(火狐叫做back-forwoad cache);所以回退操作基本不会触发onload操作了,不过上一页的状态 ...

  10. 面向对象----构造方法、this 关键字、函数的参数传递、package语句/import语句

    构造方法 构造器的定义.作用 构造方法的特征 它具有与类相同的名称:它不含返回值: 注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动 ...