一个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 | 对帐标志 |
《asp.net core精要讲解》 https://ke.qq.com/course/265696
《asp.net core 3.0》 https://ke.qq.com/course/437517
《asp.net core项目实战》 https://ke.qq.com/course/291868
《基于.net core微服务》 https://ke.qq.com/course/299524