c# class to Js class?



我在c#中有一个类Person。

我想能够在我的js:

var p = new Person();

稍后,我通过jQuery Ajax 将p对象发送到ashx

哪些库(jQuery?xxx?)可以帮助我做到这一点?

我知道Ajaxtookit有一个属性:ScriptService

但我不确定这个解决方案有多好。

您可以将ASPX PageMethods与jQuery一起使用。因此,通过定义一个模型开始在服务器上工作:

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脚本。


更新:

正如评论部分所要求的,以下是如何设计一个通用的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);
    }
});

使用json,使用json.NET Library 将c#对象转换为json

正确的做法是在JavaScript 中定义一个人物原型

var Person = {
  someMethod: function () {
  },
  someMoreMethods: function () {
  }
};

然后,您让C#服务器以JSON的形式发送其Person实例的序列化版本,并且在客户端上只有一个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,自己以合理的方式处理遗留的浏览器引擎。

最新更新