asp.net的ajax以及json


來現在這家公司以前,從未接觸過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的使用方法的試用)

object對象:
通過JsonConvert.SerializeObject(p1)轉換出的string【json對象】為:
"{\"name\":\"zjq\",\"age\":14,\"sex\":\"man\",\"lover\":{\"name\":\"htt\",\"sex\":\"nv\",\"age\":14,\"birth\":\"2010-05-10T15:56:45.9389376+08:00\"},\"birth\":\"2010-05-19T15:56:43.515799+08:00\"}"
 
分析:
  1. 整個json都在“”包圍中,並以{}開始結尾。
  2. 屬性與值都用“”括起來,值為對象以及數字的時候則不用。
  3. 日期被直接轉換成字符串的日期了,日期與時間用T格開,時間后面+時區
將數據轉到前台,顯示,然后不做處理,直接傳回后台,內容為: {"name":"zjq","sex":"man","birth":"2010-05-19T16:46:54.9250418 08:00","age":14},后台用:JsonConvert.DeserializeObject<Person>(string)轉出的Person對象為:
分析:
  1. 日期已經被正常轉換。
  2. 沒回傳的數據默認為null。
  3. 數字直接被轉換。
其它情況:
    關於時間的測試:
前台的時間 后台接收后反序列化后的對象中的時間



結論:
前台傳來的日期沒有太高要求,但是必須放在“”中,作為字符串。

 

差不多就這么些了,還有好多沒時間寫,有空再寫,小弟菜鳥一枚,大神們輕噴~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM