使用者給我的介面有兩個步驟完成投票,第一個步驟有兩個區塊,一個是即時登入頁面,一個是即時註冊頁面;第二個步驟是投票選項,這兩個步驟都選定了才能將資料送出。
附帶條件是不能利用連結導向到登入頁面和註冊頁面,因為怕瀏覽者點走了就不知道怎麼回來,所以只能在當頁將所有動作完成。
遇到這個狀況,我想說如果使用 ajax 送出資料到另一個頁面去註冊或者做登入,那成功或錯誤訊息送回來,我要怎麼將傳回來的 MemberID 存起來,隱藏欄位?cookie?最後決定使用 post 到 ashx 再將 MemberID 傳回來,再將傳回來的資料存在session內,繼續做投票動作。
於是 我參考了 [ASP.NET]在server端post資料到.ashx 內的程式碼來解決問題。
LoginHander.ashx.cs
public class LoginHandler : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string strID = string.Empty;
string strMsg = string.Empty;
string strEMail = context.Request.Form["Email"];
string strPassword = context.Request.Form["Password"];
if (string.IsNullOrEmpty(strEMail))
{
strMsg += (strMsg == string.Empty) ? "Please input email address.<br/>" : "";
}
if (string.IsNullOrEmpty(strPassword))
{
strMsg += (strMsg == string.Empty) ? "Please input password.<br/>" : "";
}
//建立會員資料查詢物件
string msg;
bool isSuccess = /* 檢查帳密是否正確 */
if (!isSuccess)
{
strMsg += (strMsg == string.Empty) ? "Sorry, unrecognized email address or password.<br/>" : "";
}
/* 額外判斷 */
strID = /* 取得會員ID */
if (string.IsNullOrWhiteSpace(strMsg))
{
context.Response.Write("true," + strID);
}
else
context.Response.Write(strMsg);
}
public bool IsReusable
{
get
{
return false;
}
}
}
.aspx.cs 中的按鈕
protected void btnSubmitLogin_Click(object sender, EventArgs e)
{
lblLoginErrorMessage.Text = string.Empty;
var url = "http://www.sample.com/../../LoginHandler.ashx"; // 網址路徑
WebRequest request = WebRequest.Create(url);
request.Method = "POST";
// server 端可以透過 Request.Form["Email"] 和 Request.Form["Password"] 讀取
string postData = string.Format("Email={0}&Password={1}", txtEMail.Text, txtPassword.Text);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
using (Stream dataStream = request.GetRequestStream())
{
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
}
// Get the response.
using (WebResponse response = request.GetResponse())
{
using (Stream dataStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataStream))
{
string responseFromServer = reader.ReadToEnd();
/* 回傳資料若開頭為 true */
if (responseFromServer.Trim().StartsWith("true"))
{
/* 紀錄 ID */
Session["MemberID"] = responseFromServer.Trim().Replace("true,", "");
/* 後續資料處理 */
}
else
{
/* 錯誤訊息顯示 */
lblLoginErrorMessage.Text = responseFromServer.Trim();
}
}
}
}
}
沒有留言 :
張貼留言