來(lái)現(xiàn)在這家公司以前,從未接觸過(guò)webform,以前在學(xué)校做的項(xiàng)目是php,java以及asp.net mvc的,當(dāng)時(shí)asp.net mvc用的是razor引擎,所以,一直與aspx.cs/aspx無(wú)緣,也聽(tīng)說(shuō)過(guò)微軟硬生生地把無(wú)狀態(tài)連接改變?yōu)椤坝袪顟B(tài)連接”的霸氣之舉,并且一舉取得成功,如今,用上了,覺(jué)得,webform并不像前輩們講得那樣差,就如同c++并不像人們覺(jué)得那么落后一樣。
好了,開(kāi)頭就先說(shuō)到這里,這里面就記錄一下我對(duì)json.net的試用以及如何在aspx.cs文件中接收ajax,多數(shù)人用一般處理程序接收,即ashx文件。用一般處理程序的方法是正統(tǒng)的,因?yàn)槿绻胊spx.cs(即pager)接收的話,你多數(shù)將處理方法寫(xiě)在onload中,而之前創(chuàng)建頁(yè)面控件樹(shù)、初始化頁(yè)面、處理viewstate、處理ProecessPostData都需要做,而這些于我們ajax而言是無(wú)用功,并且它們還會(huì)向我們的Response中插入一些數(shù)據(jù),所以當(dāng)我們?cè)趏nload中處理完ajax要返回?cái)?shù)據(jù)的時(shí)候,不得不Response.Clear()來(lái)清空,然后Response.Write()寫(xiě)入我們的數(shù)據(jù),最后再用Response.End()來(lái)阻止頁(yè)面生存周期的后序操作(它們會(huì)對(duì)Response進(jìn)行好多處理并加入數(shù)據(jù))。
這是從asp.net的運(yùn)行機(jī)制上來(lái)講的,我們應(yīng)該用一般處理程序,但是,當(dāng)我們只需要偶爾使用一ajax,時(shí)不時(shí)的用一下,而并非項(xiàng)目經(jīng)理在宏觀上給我們制地使用位置的時(shí)候,我們?yōu)榱俗约旱姆奖?,隨手就新建一個(gè)ashx文件,是非常不明智的,而且對(duì)于svn來(lái)說(shuō),控制起來(lái)后患無(wú)窮,所以,我努力地找尋使用aspx.cs接收ajax的最方便的方法,并且將它的劣勢(shì)換為它的優(yōu)勢(shì)。
首先:aspx.cs中處理ajax,正是因?yàn)関iewstate被處理了,而且request對(duì)象也被正常生成了,你可以取得頁(yè)面上所有控件的當(dāng)前值,并不需要通過(guò)ajax的data傳過(guò)來(lái),想來(lái)用過(guò)ajax的人,對(duì)構(gòu)造data數(shù)據(jù)都非常的頭疼,少則幾百個(gè)字符,多則上千個(gè)字符,而且涉及到引號(hào)的問(wèn)題,單雙要求靈活使用,好不容易構(gòu)造完了,發(fā)現(xiàn)自己已經(jīng)吐血了,日后自己再敢不想看這一段代碼了。通過(guò)這種方式,我們可以將整個(gè)頁(yè)面的服務(wù)器控件數(shù)據(jù)回傳,并且不引發(fā)頁(yè)面刷新,然后我們可以收到我們想要的數(shù)據(jù),再通過(guò)js進(jìn)行局部刷新或控制,這一切都是那么完美。
下在來(lái)看一下一個(gè)精短的用例:
前臺(tái):
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>
后臺(tái)的關(guān)鍵代碼:
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 }
用到的實(shí)體對(duì)象:
1 public class Person:Object 2 { 3 public Person() 4 { 5 // 6 // TODO: 在此處添加構(gòu)造函數(shù)邏輯 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 lover16 {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 }
測(cè)試的內(nèi)容:(重點(diǎn)在于對(duì)json中的非字符串格式、json.net的使用方法的試用)
分析: |
|
分析: |
|
前臺(tái)的時(shí)間 | 后臺(tái)接收后反序列化后的對(duì)象中的時(shí)間 |
![]() | ![]() ![]() |
![]() | ![]() ![]() |
![]() | ![]() ![]() |
結(jié)論: | 前臺(tái)傳來(lái)的日期沒(méi)有太高要求,但是必須放在“”中,作為字符串。 |
差不多就這么些了,還有好多沒(méi)時(shí)間寫(xiě),有空再寫(xiě),小弟菜鳥(niǎo)一枚,大神們輕噴~~
聯(lián)系客服