• 一个B/S结构自动二次请求需求的实现


    有这样一个需求,当客户输入卡号,查询出客户的金额,如果金客大于等于1000,提示询问客户是否对帐,如果客户选择对帐,就改对客户数据进行对帐操作(其实就是改丢这个客户的对帐标志),前提是在B/S架构下实现这个功能。

    当看到这个需求时,先分解一下,来弄清数据的层次和操作的层次。

    首先数据肯定是在服务器端存放,客户端需要的数据都需要从服务端得到。操作层次是客户先把卡号送到服务端,让服务判断用户金客是否大于等于1000,如果不满足条件,就向客户端提示用户金客不足1000,不能对帐,如果满足条件,就向客户端询问用户是否对帐,如果客户选择确定对帐,就让服务端更新数据标志,如果客户选择不对帐,流程就此完结。

    现在从技术角度分析一下这个过程,B/S架构是基于HTTP协议,这个协议的特点是B端有请求,S端才有回应,一问一答的形式,当然不问,也就不答。现在就基于HTTP来考虑一下,当客户端提交卡号时,是客户端的第一次请求;服务端得到卡号从数据库中得到金额,然后跟据金额是否大于等于1000来向用户发送不同的请求,如果客户端大于等于1000,向客户端发的应答是带有询问提示框的,并有二次请求代码,如果客户金额少于1000,应答的是一个提示金额不足的代。

    提下来的焦就是怎么在第一次应答中,带有第二次请求的代码,这里的代码是请求的代码,一定是在客户端,也当然是脚本代码了。

    下面看一下代码实现:

    aspx代码:

    html xmlns="http://www.w3.org/1999/xhtml">

    <head runat="server">

    <title></title>

    </head>

    <body>

    <form id="form1" runat="server">

    <input type="hidden" name="mark" />

    <div>

    <script language="javascript" type ="text/javascript">

    function PostPage() {

    document.all.mark.value = "mark_value";

    document.form1.submit();

    }

    </script>

    </div>

    <asp:TextBox ID="Number_TB" runat="server"></asp:TextBox>

    <asp:Button ID="Sub_But" runat="server" OnClick="Sub_But_Click" Text="提交"

    Width="80px"/>

    </form>

    </body>

    </html>

    在aspx中用一个Hide标签,是用来存放标志的,在第二次客户端提交是应用。

    PostPage方法是客户端向后台提交请求的代码。

    C#代码:

    using System;

    using System.Collections.Generic;

    using System.Data;

    using System.Data.SqlClient;

    using System.Web;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    public partial class Test : System.Web.UI.Page

    {

    string constr = @"server=.\sqlexpress;database=testdb;uid=sa;pwd=sa;";

    protected void Page_Load(object sender, EventArgs e)

    {

    if (IsPostBack)

    {

    //实现对前台标志的判断

    string mark = Request.Form["mark"] != null ? Request.Form["mark"] : "";

    if (mark == "mark_value")

    {

    WriteMark();

    }

    }

    }

    /// <summary>

    /// 更新数据库,写数据据对帐标志

    /// </summary>

    public void WriteMark()

    {

    string SQL = "update member set accmark=1 where number=@number";

    SqlConnection con = new SqlConnection(constr);

    SqlCommand cmd = new SqlCommand();

    try

    {

    cmd.CommandText = SQL;

    cmd.Connection = con;

    cmd.Parameters.Clear();

    cmd.Parameters.Add("@number", SqlDbType.VarChar).Value = Number_TB.Text;

    con.Open();

    cmd.ExecuteNonQuery();

    }

    catch

    {

    this.ClientScript.RegisterStartupScript(this.GetType(), "messages", "<script>alert('更新异常!')</script>");

    }

    finally

    {

    con.Close();

    }

    }

    protected void Sub_But_Click(object sender, EventArgs e)

    {

    //按照卡号查询金额

    double amount = 0d;

    string SQL = "select amount from member where number=@number and accmark=0";

    SqlConnection con = new SqlConnection(constr);

    SqlCommand cmd = new SqlCommand();

    try

    {

    cmd.CommandText = SQL;

    cmd.Connection = con;

    cmd.Parameters.Clear();

    cmd.Parameters.Add("@number", SqlDbType.VarChar).Value = Number_TB.Text;

    con.Open();

    amount = Convert.ToDouble(cmd.ExecuteScalar());

    }

    catch

    {

    this.ClientScript.RegisterStartupScript(this.GetType(), "message", "<script>alert('查询异常!')</script>");

    }

    finally

    {

    con.Close();

    }

    //判断金额是否大于500

    if (amount > 500)

    {

    //下面的代码是调用二次请求的代码,用confirm来提示用户做判断

    string s = " <script language='javascript'>if(confirm('您的金额为:" + amount + "元,确定要对帐吗?')){ PostPage(); }</script>";

    this.ClientScript.RegisterStartupScript(this.GetType(), "clientScript", s);

    }

    else

    {

    string s = " <script language='javascript'>alert('您的金额不足1000元');</script>";

    this.ClientScript.RegisterStartupScript(this.GetType(), "clientScript", s);

    }

    }

    }

    数据库结构:

    列名

    数据类型

    备注

    id

    Int

    编号主键,自动增长

    number

    Varchar(50)

    卡号

    amount

    Float

    金额

    accmark

    int

    对帐标志

  • 相关阅读:
    VS2005 web程序自定义安装包的制作[转]
    "控件必须放在具有 runat=server 的窗体标记内"错误的解决方法
    Reader转化为Entity类时系统性能的测试报告
    NetBeans6.1(6.5)Visual Web JSF 应用程序开发的一个BUG
    .net操作PDF的一些资源(downmoon收集)
    NetBeans中jsp或java乱码的几种办法(downmoon收集)
    后微软时代,我们还能依靠谁?(downmoon原创)
    从dataReader到Entity转化时利用Reflect示例(解决OutOfRangeException错误)(downmoon)
    HttpCookie.HttpOnly VS Cookie.HttpOnly?(downmoon原创)
    Windows PowerShell 编写正则表达式(转自TechNet Magazine)
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/1499707.html
Copyright © 2020-2023  润新知