我正在使用JQuery和ajax调用asp.net webservice,使用json传输数据。 我正在创建将json字符串化的javascript对象。我需要我的webmethod来检索这些特定的对象类型,但我的参数类型是一个基类,这些对象继承自我的基类,如下所示:
[DataContract]
[KnownType(typeof(TextareaObject))]
[KnownType(typeof(TextObject))]
public class FormElement
{
public FormElement()
{}
}
和:
[DataContract(Name = "textObject")]
public class TextObject : FormElement
{
[DataMember]
public string question { get; set; }
public TextObject(string question)
{
this.question = question;
}
}
和我的网络方法:
[WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract]
[ServiceKnownType(typeof(TextObject))]
[ServiceKnownType(typeof(TextareaObject))]
public void SaveForm(List<FormElement> formobjects)
{
...
}
这就是我创建javascript对象的方式(我只复制代码的相关示例):
//objects to serialize
function textObject(question) {
this.question = question;
}
//objects to serialize
function textareaObject(question, rownumber) {
this.question = question;
this.rownumber = rownumber;
}
var objectarray = new Array();
if (type == 'text') {
textobject1 = new textObject(typedquestion);
objectarray.push(textobject1);
}
else if (type == 'textarea') {
var rownumber = $(elm).children('textarea').attr('rows');
textareaobject1 = new textareaObject(typedquestion, rownumber);
objectarray.push(textareaobject1);
}
var formobjects = JSON.stringify(objectarray);
$.ajax({
type: "POST",
//Page Name (in which the method should be called) and method name
url: urlhtml,
data: '{"formobjects":' + formobjects + '}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
//dosmth
}
});
我希望asp.net服务器能够反序列化我的数组中的正确类型。 但是在我的web方法中,“formobjects”都是FormElement类型,即使使用serviceknowntype属性,我也无法获得它们的真实类型。是因为javascript没有强类型,我无法检索具体类型?因为字符串化的json不会给出具体的类型? 我试过
textObject.prototype = new textObject(typedquestion);
objectarray.push(textObject.prototype);
并且json给出了类似的东西:
{"formobjects":{"textObject": {"question":"test"}}}
但是服务器端同样老旧,我只在webmethod中获取FormElement类型而且我无法投射。
也许我想做的事是不可能的.. 无论如何,谢谢你!
答案 0 :(得分:0)
没有类型信息,因此WCF序列化程序不知道要反序列化的类型。
如果有办法根据json的格式计算出来,你可以编写自己的序列化程序来处理这种方法的反序列化 - 请参阅this MSDN blog post了解如何为WCF编写自定义序列化程序。 / p>
答案 1 :(得分:0)
如果你在c#4上,我认为这是你可以使用新类型dynamic
的情况:
答案 2 :(得分:0)
我找到了答案。就像rich.okelly说的那样,没有用弱类型语言发送的类型信息是javascript,因为javascript类不是像.net那样的真实类。但微软预计,你需要使用他们所称的&#34;输入提示&#34;,这意味着你要添加&#34; __ type&#34;属性到你的javascript对象,并在第一个位置像这样:
//objects to serialize
function textObject(__type, question) {
this.__type = __type;
this.question = question;
}
(...)
var textobject1 = new textObject("textObject:#",typedquestion);
甚至将其添加到课程本身,这样您就不会每次都添加它来设置它:
//objects to serialize
function textObject(question) {
this.__type = "textObject:#";
this.question = question;
}
(...)
var textobject1 = new textObject(typedquestion);
在问题获胜后添加__type工作。另外,即使没有名称空间,您也需要添加&#34;:#&#34;在它之后。模式如下:&#34; datacontractname:#datacontractnamespace&#34;。 我发现它以编程方式在我的TextObject上创建序列化器,以便我可以找到所需的格式。然后我的webmethod收到的formelement是TextObject的类型!任务完成 ! 谢谢大家!