1.前言
在初学习MVC过程中,学到了不少的新东西,为了避免今后忘记,现在先记录下简单的学习笔记
2.MVC简介
对于大部分同行来说,对于MVC肯定不会陌生吧。笔者是一个语言上的巨人,行动上的矮子。一直以来都想学习MVC框架,不过一直停留在基础的定义上。只知道MVC的定义,即M:model(模型),V:View(视图),C:controller(控制器),然后每当别人说起MVC时,自以为已经很熟了,真正写的时候才发现完全不会。废话不多说,开始吧。
MVC的介绍,网上有不少,我这里就不再粘贴复制介绍了,想了解的朋友可以参照https://www.cnblogs.com/netcorner/p/3757092.html。
3.测试项目结构
项目的目录结构如下图所示
目录结构主要包含(从上到下)以下几个部分
App_Start:主要包含路由配置相关信息,主要用来导航到指定的控制器(路由是MVC中很重要的一个部分)。路由相关的知识可以参照博主https://www.cnblogs.com/landeanfen/p/5989092.html
Controllers:就是我们熟悉的定义里的controller(控制器),主要是通过获取view层传来的数据,调用后台(model层)处理(eg:数据查询)返回数据给view层
Models:这就是我们的model层(模型层)。主要作用是定义数据模型和一些对数据库操作的方法,用来处理数据,并返回结果给controller层
views:就是我们用户能见到的视图部分。这里要注意VIew视图的结构。MVC规定,视图结构和名称需参照controller控制器,具体的规则下面会介绍。
最外层的web.config文件:主要加入一些数据库连接字符串之类的静态配置。
4.App_Start介绍
App_Start部分,由FilterConfig、RouteConfig、WebApiConfig三部分组成。
FilterConfig:主要用来为我们的程序添加过滤规则。详细介绍参照FilterConfig介绍
RouteConfig:目前笔者只用到了RouteConfig配置,对路由配置进行一些修改
WebApiConfig:开发WebApi用的,需要开发WebApi的可以了解下。
下面我们着重介绍下RouteConfig,具体代码如下:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "SysAdmin", action = "Index", id = UrlParameter.Optional } ); } }
controller = "SysAdmin",标识我们的控制器名称是SysAdminController,其中Controller后缀名是控制器特有的,相当于SysAdmin才是SysAdminController的真正名称
action=“Index”,这个Index代表的是SysAdminController控制器里面的一个方法名称。该方法返回View对象。
综上看来,这个路由配置就是导航到特定的控制器执行程序,相当于一个指路人作用。
5.Controllers介绍
控制器作为MVC重要组成部分,相当于我们现实生活中的中介一般,连接的租客和房源。
控制器主要完成三个大的部分功能:1.通过Request.Params获取前端Form传递过来的数据,调用模型处理数据,返回结果数据到view层。主要代码结构如下所示
public class SysAdminController : Controller { // // GET: /SysAdmin/ public ActionResult Index() { return View("AdminLogin"); } public ActionResult AdminLogin() { //1.获取数据 SystemAdmin admin = new SystemAdmin() { LoginId =Convert.ToInt32(Request.Params["loginid"]), pwd=Request.Params["pwd"] }; //2.处理数据 SysAdminService service=new SysAdminService (); admin=service.Login(admin); //3.返回数据 if (admin != null) { ViewData["info"] = "欢迎你," + admin.Name; } else { ViewData["info"] = "用户名或密码错误!"; } return View(); } }
其中,调用SysAdminService处理方法时,我们传入的是一个模型对象SystemAdmin ,同时返回的数据也是一个对象,这正符合我们面向对象的思想。ViewData是控制器Controller和视图VIew的公共基类的一个属性,我们通过该属性可以完成视图获取到控制器写到ViewData的数据。
注意:我们这个控制器里面有两个方法Index()和AdminLogin() 这两个方法对应本应该对应不同的视图,方法名称即对应的视图名称。由于Index方法里面返回视图时不时默认视图,加入了AdminLogin,所以两个方法的对应视图都是AdminLogin。
6.Models介绍
Models即模型部分,主要包含了数据对象模型的定义和一些数据库访问、操作方法的定义。Models结构如下图所示
OracleHelper:主要是对数据库的一些底层操作方法,具体代码如下所示
public class OracleHelper { private static string conn = ConfigurationManager.ConnectionStrings["conn"].ToString(); public static SqlDataReader GetDataReader(string sql) { SqlConnection con = new SqlConnection(conn); SqlCommand cmd = new SqlCommand(sql, con); try { con.Open(); return cmd.ExecuteReader(CommandBehavior.CloseConnection);//CommandBehavior.CloseConnection作用:如果关联的datareader关闭,则con连接也一起关闭 } catch (Exception ex) { //错误信息写入日志 throw ex; } } }
其中需要注意的是:在执行cmd.ExecuteReader(CommandBehavior.CloseConnection);时,需要传入CommandBehavior.CloseConnection,以便关联的datareader关闭,则con连接也一起关闭
SysAdminService:主要定义一些方法用用来访问OracleHelper,提供给controller调用来实现数据处理,主要代码如下
public class SysAdminService { public SystemAdmin Login(SystemAdmin admin) { string sql = string.Format("select name from sysadmin where loginid={0} and pwd='{1}'",admin.LoginId,admin.pwd); SqlDataReader reader = OracleHelper.GetDataReader(sql); if (reader.Read()) { admin.Name = reader["name"].ToString(); } else { admin = null; } reader.Close(); return admin; } }
注意:使用完成记得关闭reader,reader.close();
SystemAdmin:这个主要是数据库表单对应的模型类,数据对象,这个按照实际的需求定义的,主要代码如下:
public class SystemAdmin { //登录id public int LoginId { get; set; } //登录密码 public string pwd { get; set; } //登录姓名 public string Name { get; set; } }
7.Views介绍
View层是用户经常打交道的,所以美工方面也很重要,我们平时开发时,应该多注意界面的美观性。
在MVC中,对于视图和控制器命名规则有一种约束。控制器必须以controller结尾(如我们的SysAdminController),视图必须在Views文件夹下的子文件夹里面(如:Views/SysAdmin/AdminLogin.aspx),views下面的子文件夹必须需要和controller控制器去掉后缀名命名,视图的名称要和对应的控制器一致(因为控制器默认返回的视图和控制器方法名称一致),或者说控制器方法里面通过调用视图名称返回视图,如:
就是在Index方法返回 Views/SysAdmin/AdminLogin.aspx视图。
笔者的测试项目视图代码如下图所示:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> <!DOCTYPE html> <html> <head runat="server"> <meta name="viewport" content="width=device-width" /> <title>SysAdmin</title> </head> <body> <div> <form method="post" action="/SysAdmin/AdminLogin"> id:<input name="loginid" type="text"/> <br /> 密码:<input name="pwd" type="text"/> <br /> <input type="submit" value="登录" /> <%=ViewData["info"] %> </form> </div> </body> </html>
通过Form就可以把视图上的数据提交到控制器后台。注意要加入method=“post”和指定控制器路径action="/SysAdmin/AdminLogin",才能调用指定控制器。
通过<%=%>可以在aspx页面添加后台代码,或者获取数据。我们这里通过<%=ViewData["info"] %>就可以获取登录之后,后台返回的消息显示。ViewData我们之前已经说过,可以在视图和控制器中互相使用。
8.结语
以上内容仅笔者的自我总结,如有不当之处,望各位园友批评指正,谢谢~