创建我的第一个MVC4-基于ASPX

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.结语

  以上内容仅笔者的自我总结,如有不当之处,望各位园友批评指正,谢谢~

 

  

原文地址:https://www.cnblogs.com/zxwDont/p/11283984.html