mvc_第一遍_业务逻辑层和模型

常用的动态网页对象:

  之前我们提到了,使用request对象可以获得和用户请求相关的一系列信息。这一节,我们来看看另外两个常用对象的常规用途。

  response对象:用于向客户回应。最常用的用法类似于

    “Response.Redirect("/Home/Index1");”

    它表示用户浏览器跳转到当前网站的“/Home/Index1”位置。

    常用于出现各种错误的时候,提前结束当前流程。

  Session对象:和ViewData的用法类似,也是用字典模式存储数据。例:

    Session["hello"] = "你好啊";

    这种变量的有效期为“当前会话”,也可以理解为“本次访问网站”。一般来说,用户退出网站,或20分钟内没有任何操作,“当前会话”就结束了。

    每个用户都可以拥有一组属于自己的Session变量,互相之间并不冲突,可以跨控制器和操作来传递值。

    基于此,它通常用来保存用户横跨全站的信息。比如用户名、权限等级、头像等等。

  例题:完成一个登录程序,输入用户名、密码,登录成功进入操作页面;否则进入出错页面。页面上显示当前用户名。

    控制器代码:    

public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index(string u="0",string p="0")
        {
            Session["user"] = u;
            if(u == "123" && p == "456")
            {
                Response.Redirect("home/get_menu");
            }
            else if(u != "0" && p != "0")
            {
                Response.Redirect("/home/wrong");
            }
            return View();
        }
        public ActionResult get_Menu()
        {
            return View();
        }
        public ActionResult Wrong()
        {
            return View();
        }
    }

    登录视图代码:      

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <form>
            用户名:<input type="text" name="u" /><br />
            密码:<input type="password" name="p" /><br />
            <input type="submit" value="登录" />
        </form>
    </div>
</body>
</html>

      登录成功视图代码:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>get_Menu</title>
</head>
<body>
    <div>
        当前用户为@(Session["user"].ToString())<br />
        已登录,这里应该出现操作菜单。。。。
    </div>
</body>
</html>

      登录失败视图代码:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Wrong</title>
</head>
<body>
    <div>
        当前用户为@(Session["user"].ToString())<br />
        登录失败,用户名、密码不正确。
    </div>
</body>
</html>

业务逻辑层

  这一层,在很多mvc的教材里并不体现,也有很多人把它归在“控制器”一类中。我自己的理解是:控制器只管调度,而业务逻辑是介于调度和读写数据之间的操作,值得另外开一层来写。

  上一章的“杨辉三角形”的练习中,控制器负责根据输入的层数,计算杨辉三角形的内容,再返回给视图,有一点混乱。我们换个写法试试。以下内容属于我的个人习惯,给大家参考。

  在项目中,新建一个文件夹“functions”,表示厨房,完成一切业务处理。在其中新建一个类,“yanghui.cs”来完成杨辉三角形的生成,如下图:

  新建文件夹:

  

  新建类:

  

  选择类型为类,名称为yanghui:

  这个类最主要的功能就是根据输入的层数,完成杨辉三角形的计算。所以可以把这个操作写成它的静态方法(不用实例化就可以调用)

  代码如下:  

public class Yanghui
    {
        public static int[,] get_Yanghui(int n)
        {
            int[,] a;
            a = new int[n, n];
            for (int i = 0; i < n; i++)
            {
                a[i, 0] = 1;
            }
            for (int i = 1; i < n; i++)
            {
                for (int j = 1; j <= i; j++)
                {
                    a[i, j] = a[i - 1, j - 1] + a[i - 1, j];
                }
            }
            return a;
        }
    }

  控制器简化为:

public ActionResult Index(int n=0)
        {
            if (n == 0)
            {
                ViewData["d1"] = null;
            }
            else
            {
                ViewData["d1"] = Yanghui.get_Yanghui(n);
            }
            return View();
        }

  别忘了在控制器文件的头部引入业务逻辑所在的名称空间:

using WebApplication1.functions;

  这样的控制器,看起来才像个老板的样子,仅负责调度。项目也更加清晰。

  即:根据输入的参数,决定哪些东西送厨房加工,哪些东西直接让服务员拿给客户。

  视图代码不变,程序执行的效果也不变,但整个程序更加清晰流畅了。

模型:

  直观认识:

    上一篇控制器和视图的课程最后,给大家留了一个完成对学生数据增删改查的小作业。那个时候,我们的程序逻辑都集中在控制器中。

    现在我们可以回头想想,程序应该如何布局。由于通篇都是是对数据库的基本操作,动用“厨房”,是不是感觉也有点不太对。

    对于这种“体力活”,我们可以引入一个新的模块来处理----模型。

    那个例子中,所有的操作都是对“学生”数据完成。“学生”就成了一个频繁和数据库交互的部分。它一方面要跟数据库打交道,另一方面又需要跟程序有交集。就像一根钉子,嵌在物体里的部分要尖,被敲击的部分要平。

    模型也是如此。它负责跟数据库打交道,有了它之后,程序里就不用再去管库……甚至不用管库里的逻辑(当然,写模型的时候这些都要管);另一方面,它必须向“厨房”和“老板”提供很好的使用方法。我们通常也用类来完成模型的工作。

    以下代码可以作为模型用在那个例子当中:

class Student
    {
        string id,xm, nl, zy,sql;//sql是某条记录准备执行的操作语句
        public Student(string input_id)//构造函数1,只初始化编号,显然准备删除自己
        {
            id = input_id;
        }
        public Student(string input_xm,string input_nl,string input_zy)//构造函数2,没有编号,看样子要把自己插入表中
        {
            xm=input_xm;
            nl = input_nl;
            zy = input_zy;
        }
        public Student(string input_id,string input_xm, string input_nl, string input_zy)//构造函数3,啥都有,用于更新
        {
            id = input_id;
            xm = input_xm;
            nl = input_nl;
            zy = input_zy;
        }
        public void insert_it()//插入方法
        {
            sql = "insert into xs(xm,nl,zy) values(‘"+xm+"‘,"+nl+",‘"+zy+"‘)";
            Hc_db.do_nonquery(sql);
        }
        public void modify_it()//修改方法
        {
            sql = "update xs set xm=‘"+xm+"‘,nl="+nl+",zy=‘"+zy+"‘ where id="+id;
            Hc_db.do_nonquery(sql);
        }
        public void delete_it()//删除方法
        {
            sql = "delete from xs where id=" + id;
            Hc_db.do_nonquery(sql);
        }
    }

    有了Student类(模型)这个工具,控制器只需要接到数据和请求的操作后,new一个具体的“学生”对象出来,就可以直接操作了。有点像客人只点了一杯清水,老板可以直接让打水的小厮端上来就好。

    比如,处理删除的控制器代码大致是这样(不严谨,仅供参考):

public ActionResult Index(string stu_id)
        {
            Student stu = new Student(stu_id);
            stu.delete_it();
            return View();
        }

    转书上P41

    请大家按照这种逻辑,忘掉上面的代码,自己写一套学生信息管理程序(MVC俱全)

小综合练习:

    上例中,如果处理这些操作的业务逻辑比较复杂(比如在删除学生之前需要判断该学生成绩是否合格,操作者权限是否足够等等),则直接交给“厨房“执行。

    参考这种思想,结合之前的知识,在上面例子的基础上写一套带权限管理的学生信息管理程序。内容如下:

      1、网站起始页显示所有学生信息。

      2、网站用户分为”未登录“、”普通“、”管理员“三个级别。

      3、未登录用户仅能查看所有学生信息。

      4、普通用户可以查询指定学生信息、添加新学生。

      5、管理员可以修改、删除学生信息。

原文地址:https://www.cnblogs.com/wanjinliu/p/11519024.html

时间: 2024-10-08 15:22:15

mvc_第一遍_业务逻辑层和模型的相关文章

微软-创建业务逻辑层

https://msdn.microsoft.com/zh-cn/dd255899 简介 在教程一中创建的数据访问层 (DAL) 将数据访问逻辑与表示逻辑清晰地分离开来.然而,尽管 DAL 从表示层中清晰地分离出数据访问层细节,它却并没有实施任何可能采用的业务规则.例如,我们想让我们的应用程序在 Discontinued 字段设为 1 时禁止对 Products 表的 CategoryID 或 SupplierID 字段的修改,还有,我们可能想实施一些资历规则以便禁止发生这样的情况:雇员被其后入

在 ASP.NET 中创建数据访问和业务逻辑层(转)

.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均与表示层分离.表示层由网站用户有权查看或更改数据的页面组成. ASP.NET 可通过多种方式提供数据访问.业务逻辑和表示形式之间的分离.例如,数据源模型(包括 LinqDataSource 和 ObjectDataSource 等服务器控件)可将表示层与数据访问代码和业务逻辑分离. 另一种模式是将数

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程 前言:前面几篇博客我们基本已经介绍完了搭建整个项目和数据库访问层以及一些业务逻辑层的实现,当然了,我们的数据库访问层这样还是可以在进行封装的,但是我到这里就行了吧,项目也不大,不需要那么麻烦的,那么我们今天开始介绍我们需要介绍的内容,那就是我

项目架构开发:业务逻辑层之领域驱动失血模型

前边我们构建了个数据访问层,功能虽然简单,但是基本够用了.传送门:项目架构开发:数据访问层 这次我们构建业务逻辑层 业务逻辑是一个项目.产品的核心,也是现实世界某种工作流程在代码层面的体现. 所以,业务逻辑的合理组织构造,或更真实地反映现实业务操作,对项目的成功与否非常重要 现在业界对业务逻辑层的开发,一般会参考Martin Fowler大师提出来的针对业务层开发的四种模式 分别是面向过程的事务脚本.表模块模式,面向对象的活动记录与领域开发模式 我们要做的就是领域驱动开发模式,注意标题中的“失血

JavaEE使用三层架构(显示层、业务逻辑层、数据访问层)实现数据的增删改查

实例: 1.功能描述 实现一个简易新闻发布系统,包括查看.添加.修改和删除新闻等基本功能 2.具体要求 (1) 创建数据库 newssystem,创建表 news,要求如下: (2) 程序运行时,显示'发布新闻'页面(如图 1),输入相关内容,单击'提交'按钮,将新闻内容添加到数据库 (3) 单击图 1 中的'查看'按钮,显示'查看新闻'页面(如图 2),增加'修改'和'删除'链接 (4) 单击图 2 中的'update'链接,显示'修改新闻'页面(如图 3),修改后单击'修改'按钮确认,单击'

MVC5 网站开发之四 业务逻辑层的架构和基本功能

一.业务逻辑层的架构 Ninesky.Core包含两个命名空间Ninesky.Core和 Ninesky.Core.Types. Ninesky.Core包含模型和功能实现,Ninesky.Core.Types是项目用到的一些类型的定义. 1.Ninesky.Core命名空间的结构   NineskyContext-数据上下文 ContextFactory- 获取数据上下文的工厂类  BaseManager-基础类,实现了一些常用数据访问方法,提供其他管理类继承. Category-栏目模型.

系统架构师-基础到企业应用架构-业务逻辑层

一.上章回顾 上章我们主要讲述了系统设计规范与原则中的具体原则与规范及如何实现满足规范的设计,我们也讲述了通过分离功能点的方式来实现,而在软件开发过程中的具 体实现方式简单的分为面向过程与面向对象的开发方式,而目前更多的是面向对象的开发设计方式.并且我们也讲述了该如何通过设计手段去分析功能点及设计分离 点,应该如何在设计的过程中分析的角度及如何去满足设计规范与原则.首先我们通过下图来回顾下上章要点: 二.摘要 本文将已架构的方式去分析分层结构中的业务层的设计,如何写出来内聚度,高耦合的业务逻辑层

你的业务逻辑层是否是被架空了?(一)

问题 1. "你的业务逻辑层为什么要按照数据库的表来建立.一旦数据库的表更改了岂不是业务逻辑层也要更改么."当大师傅问我这个问题的时候,我才反应过来我的业务逻辑层理解的有问题,当时我是把业务逻辑都放到了U层,导致U层很累赘. 2.当沾沾自喜以为给U层解负担的时候,惊奇的发现,B层还是被架空了.(这个问题是出于B层依然是按照数据库表来建立的.) 所以,我才重新开始反思 ,业务逻辑层的到底是应该怎么建立,为什么第一次发现这个问题了,还出现业务逻辑层架空的问题. 原因分析 什么是业务逻辑层?

JSP业务逻辑层

经典的三层架构:表示层.业务逻辑层和数据访问层 具体的区分方法 1:数据访问层:主要看你的数据层里面有没有包含逻辑处理,实际上他的各个函数主要完成各个对数据文件的操作.而不必管其他操作. 2:业务逻辑层:主要负责对数据层的操作.也就是说把一些数据层的操作进行组合. 3:表示层:主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问. 表示层 位于最外层(最上层),最接近用户.用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面. 业务逻辑层 业务逻辑层(Business L