2012-01-07 23 views
2

我在c#中有一個Person類。c#類到Js類?

我希望能夠在我的JS做:

var p = new Person(); 

後來林通過jQuery的Ajax發送p對象到一個ASHX

哪些庫(jQuery的XXX?),它可以幫助我這樣做?

我知道Ajaxtookit有一個屬性:ScriptService

但林不知道有多好,這個解決方案。

+0

您使用WebForms或MVC? – 2012-01-07 15:00:37

+0

@ M.Babcock webforms – 2012-01-07 15:01:49

+0

你不這樣做。你不能將一個C#類移植到JavaScript中。你重新定義JavaScript中的「class」 – Raynos 2012-01-07 15:12:53

回答

7

您可以在jQuery中使用ASPX PageMethods。因此,通過定義模型開始在服務器上的工作:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

,那麼你可以定義一些aspx頁面一個頁面的方法(/foo.aspx):

public partial class _Foo : System.Web.UI.Page 
{ 
    [WebMethod] 
    public static string SavePerson(Person p) 
    { 
     // do some processing with the person 
     return "Hello World"; 
    } 
} 

最後調用該頁面方法:

var p = { 
    firstName: 'John', 
    lastName: 'Smith' 
}; 
$.ajax({ 
    url: '/foo.aspx/SavePerson', 
    type: 'POST', 
    contentType: 'application/javascript; charset=utf-8', 
    data: JSON.stringify(p), 
    success: function(result) { 
     alert(result.d); 
    } 
}); 

這裏所示的JSON.stringify方法是在現代瀏覽器中構建的。如果您需要支持舊版瀏覽器,則可以將json2.js腳本添加到您的網頁中。


UPDATE:

正如在評論部分要求這裏是你如何可以設計一個通用的ASHX處理程序,將接收到這個請求,做一些處理並返回一個JSON響應:

public class Foo : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     var serializer = new JavaScriptSerializer(); 
     using (var reader = new StreamReader(context.Request.InputStream)) 
     { 
      Person person = (Person)serializer.Deserialize<Person>(reader.ReadToEnd()); 
      // do some processing with the person 

     } 
     context.Response.ContentType = "application/json"; 

     var result = serializer.Serialize(new { data = "Hello World" }); 
     context.Response.Write(result); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

和請求:

var p = { 
    firstName: 'John', 
    lastName: 'Smith' 
}; 
$.ajax({ 
    url: '/foo.ashx', 
    type: 'POST', 
    data: JSON.stringify(p), 
    success: function(result) { 
     alert(result.data); 
    } 
}); 
+0

我不使用aspx理由ashx所以我沒有webmethod attr。我怎樣才能改變你的代碼使用ASHX文件? – 2012-01-07 16:03:47

+0

@RoyiNamir,答案更新了一個使用通用ASHX處理程序的示例。 – 2012-01-07 16:09:38

+0

@感謝男人! .. – 2012-01-07 16:11:08

2

使用json,使用Json.NET圖書館

+0

這只是將數據轉換爲JSON格式,不允許以任何方式在JavaScript中使用C#書寫的類。它不允許發送,但這只是一部分。 – Dykam 2012-01-07 15:00:45

1

做正確的事情在JavaScript

var Person = { 
    someMethod: function() { 

    }, 
    someMoreMethods: function() { 

    } 
}; 

是定義一個人的原型然後你得到你的C#服務器的C#對象轉換爲JSON發送一個序列化版本它是Person實例作爲JSON和客戶端上你只是有一個XHR處理

xhr.addEventListener("load", function() { 
    var personJSON = JSON.parse(this.responseText); 
    var personInstance = Object.create(Person); 
    var person = extend(personInstance, personJSON); 
}); 

在這裏,您可以獲取屬於所有屬性的人員的json數據。你創建一個Person類的新原型實例,以便實例擁有所有的方法。然後使用通過JSON獲取的數據/屬性來擴展實例。

注意,您必須實現extend,一個天真的實施將

function extend(target, source) { 
    Object.getOwnPropertyNames(source).forEach(function (name) { 
    var pd = Object.getOwnPropertyDescriptor(source, name); 
    Object.defineProperty(target, name, pd); 
    }); 
    return target; 
} 

免責聲明:示例代碼使用了ES5,以合理的方式處理遺留的瀏覽器引擎的自己。