來現在這家公司以前,從未接觸過webform,以前在學校做的項目是php,java以及asp.net mvc的,當時asp.net mvc用的是razor引擎,所以,一直與aspx.cs/aspx無緣,也聽說過微軟硬生生地把無狀態連接改變為“有狀態連接”的霸氣之舉,並且一舉取得成功,如今,用上了,覺得,webform並不像前輩們講得那樣差,就如同c++並不像人們覺得那么落后一樣。
好了,開頭就先說到這里,這里面就記錄一下我對json.net的試用以及如何在aspx.cs文件中接收ajax,多數人用一般處理程序接收,即ashx文件。用一般處理程序的方法是正統的,因為如果用aspx.cs(即pager)接收的話,你多數將處理方法寫在onload中,而之前創建頁面控件樹、初始化頁面、處理viewstate、處理ProecessPostData都需要做,而這些於我們ajax而言是無用功,並且它們還會向我們的Response中插入一些數據,所以當我們在onload中處理完ajax要返回數據的時候,不得不Response.Clear()來清空,然后Response.Write()寫入我們的數據,最后再用Response.End()來阻止頁面生存周期的后序操作(它們會對Response進行好多處理並加入數據)。
這是從asp.net的運行機制上來講的,我們應該用一般處理程序,但是,當我們只需要偶爾使用一ajax,時不時的用一下,而並非項目經理在宏觀上給我們制地使用位置的時候,我們為了自己的方便,隨手就新建一個ashx文件,是非常不明智的,而且對於svn來說,控制起來后患無窮,所以,我努力地找尋使用aspx.cs接收ajax的最方便的方法,並且將它的劣勢換為它的優勢。
首先:aspx.cs中處理ajax,正是因為viewstate被處理了,而且request對象也被正常生成了,你可以取得頁面上所有控件的當前值,並不需要通過ajax的data傳過來,想來用過ajax的人,對構造data數據都非常的頭疼,少則幾百個字符,多則上千個字符,而且涉及到引號的問題,單雙要求靈活使用,好不容易構造完了,發現自己已經吐血了,日后自己再敢不想看這一段代碼了。通過這種方式,我們可以將整個頁面的服務器控件數據回傳,並且不引發頁面刷新,然后我們可以收到我們想要的數據,再通過js進行局部刷新或控制,這一切都是那么完美。
下在來看一下一個精短的用例:
前台:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 2 ..... 3 <script type="text/javascript"> 4 5 function setPerson() { 6 $.ajax({ 7 url: "default.aspx?ajax=setPerson", 8 type: "POST", 9 dataType: "JSON", 10 data: '{"name":"' + $("#name").val() + '","sex":"' + $("#sex").val() + '","birth":"' + $("#birth").val() + '","age":' + $("#age").val() + '}', 11 sucess: function (data) { 12 } 13 }); 14 } 15 function getPerson() { 16 $.ajax({ 17 url: "default.aspx?ajax=getPerson", 18 type: "POST", 19 dataType: "JSON", 20 success: function (data) { 21 datar = data; 22 $("#name").val(data.name); 23 $("#sex").val(data.sex); 24 $("#birth").val(data.birth); 25 $("#age").val(data.age); 26 } 27 }); 28 } 29 </script>
后台的關鍵代碼:
1 public partial class _Default : System.Web.UI.Page 2 { 3 protected void Page_Load(object sender, EventArgs e) 4 { 5 Person p1 = new Person(); 6 p1.name = "zjq"; 7 p1.age = 14; 8 p1.sex = "man"; 9 p1.birth = DateTime.Now.AddDays(-1213); 10 lover l=new lover(); 11 l.name="htt"; 12 l.sex="nv"; 13 l.age=14; 14 l.birth = DateTime.Now.AddDays(-1222); 15 p1.lover = l; 16 string jsonstr = JsonConvert.SerializeObject(p1); 17 if (Request.QueryString["ajax"] != null) 18 { 19 string method=Request.QueryString["ajax"].ToString().Trim().ToLower(); 20 if (method == "add") 21 { 22 string n3 = Server.UrlDecode((new System.IO.StreamReader(Request.InputStream)).ReadToEnd()); 23 Response.Write("{data:{"+n3+",result:'s'}"); 24 25 Response.End(); 26 } 27 else if (method == "savejson") 28 { 29 Person p = JsonConvert.DeserializeObject<Person>(new StreamReader(Request.InputStream).ReadToEnd()); 30 int i = 1; 31 32 } 33 else if (method == "getperson") 34 { 35 Response.Clear(); 36 Response.Write(jsonstr); 37 Response.End(); 38 } 39 else if (method == "setperson") 40 { 41 Person p = JsonConvert.DeserializeObject<Person>(new StreamReader(Request.InputStream).ReadToEnd()); 42 string name = p.name; 43 Response.Clear(); 44 Response.End(); 45 } 46 } 47 } 48 }
用到的實體對象:
1 public class Person:Object 2 { 3 public Person() 4 { 5 // 6 // TODO: 在此處添加構造函數邏輯 7 // 8 } 9 public string name { set; get; } 10 public int age { get; set; } 11 public string sex { get; set; } 12 public lover lover { get; set; } 13 public DateTime? birth { get; set; } 14 } 15 public class lover 16 { 17 public string name { get; set; } 18 public string sex { get; set; } 19 public int age { get; set; } 20 public DateTime? birth { get; set; } 21 }
測試的內容:(重點在於對json中的非字符串格式、json.net的使用方法的試用)


分析: |
|


分析: |
|
前台的時間 | 后台接收后反序列化后的對象中的時間 |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
結論:
|
前台傳來的日期沒有太高要求,但是必須放在“”中,作為字符串。 |
差不多就這么些了,還有好多沒時間寫,有空再寫,小弟菜鳥一枚,大神們輕噴~~