c#类到Js类?
我有一个c#班的学生 我希望能够在我的js中做到:c#类到Js类?,c#,javascript,jquery,asp.net,C#,Javascript,Jquery,Asp.net,我有一个c#班的学生 我希望能够在我的js中做到: var p = new Person(); 稍后,我将通过jqueryajax向ashx发送p对象 哪些库(jQuery?xxx?)可以帮助我做到这一点 我知道Ajaxtookit有一个属性:ScriptService 但是我不确定这个解决方案有多好。使用,使用库将c#对象转换为json正确的做法是用JavaScript定义person原型 var Person = { someMethod: function () { },
var p = new Person();
稍后,我将通过jqueryajax向ashx发送p对象
哪些库(jQuery?xxx?)可以帮助我做到这一点
我知道Ajaxtookit有一个属性:ScriptService
但是我不确定这个解决方案有多好。使用,使用库将c#对象转换为json正确的做法是用JavaScript定义person原型
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);
});
这里,您将获取person的json数据,这些数据是所有属性。创建Person“class”的新原型实例,使该实例具有所有方法。然后使用通过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,请自己以合理的方式处理传统浏览器引擎。您可以将ASPX PageMethods与jQuery结合使用。因此,通过定义模型开始服务器上的工作:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后,您可以在某些aspx页面(/foo.aspx
)中定义页面方法:
最后调用此页面方法:
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方法是在现代浏览器中构建的。如果需要支持传统浏览器,可以将脚本包含到页面中
更新: 根据评论部分的要求,您可以设计一个通用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;
}
}
}
你是在使用WebForms还是MVC?你不会这么做的。你不能仅仅把一个C类移植到JavaScript中。您在中重新定义了“类”JavaScript@Raynos你错了。有这样的图书馆。我看到了-例如:scriptService属性。@RoyiNamir从C#自动生成javascript是一种生成平庸代码的好方法,这些代码会在边缘泄漏。正确操作。@RoyiNamir-您使用的是什么版本的.NET?如果您使用的是.NET 4,那么您可以使用新的
动态
关键字,例如。这只是将数据转换为JSON格式,不允许以任何方式在javascript中使用C#编写的类。它不允许发送,但这只是其中的一部分。我不使用aspx jus ashx,所以我没有webmethod attr。如何更改您的代码以使用ASHX文件?@RoyiNamir,用一个使用通用ASHX处理程序的示例更新了答案。为什么我无法在Request.form中看到值,而只能在context.Request.InputStream中看到值?(您是以post的形式发送的,为什么它没有在request.form中显示?@RoyiNamir,在本例中,我们直接将JSON请求发送到流中。没有Request.Form。如果要发送JSON请求,则不能使用此选项。如果不想发送JSON请求,请删除JSON.stringify
调用。然后,您可以在处理程序中使用Request[“FirstName”]
来获取单个属性。但是,如果你已经拥有了整个对象,为什么还需要这个呢
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);
}
});