Fork me on GitHub

一个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

对帐标志

posted @ 2009-06-09 15:37  桂素伟  阅读(668)  评论(0编辑  收藏  举报