【发布时间】:2013-09-14 13:46:31
【问题描述】:
假设有一个简单的界面:
public interface ISerialize
{
string FirstProp { get; set; }
string SecondProp { get; set; }
}
由类实现:
public class Class1 : ISerialize
{
public string FirstProp { get; set; }
public string SecondProp { get; set; }
public string ThirdProp { get; set; }
}
public class Class2 : ISerialize
{
public string FirstProp { get; set; }
public string SecondProp { get; set; }
public string FourthProp { get; set; }
}
目前(这并不意味着长期稳定)我有一个如下所示的网页:
http://jsfiddle.net/SBbPT/ 其中每个文本框对应于 Class1 或 Class2 对象中的一个属性,Add to batch 链接将对象添加到 JavaScript 数组,Submit batch 按钮将 JSON 字符串发送到字符串化对象的 Web 服务。
暂且由下面的JS判断创建Class1还是Class2的类型:
$(document).ready(function ()
{
var iSerialize = [];
$('#btnSubmit').click(function ()
{
//creates Class1 object if ThirdProp is present
if ($('#txt3').val().length > 0)
{
var class1 = { FirstProp: $('#txt1').val(), SecondProp: $('#txt2').val(), ThirdProp: $('#txt3').val() }
iSerialize.push(class1);
}
else
{
var class2 = { FirstProp: $('#txt1').val(), SecondProp: $('#txt2').val(), FourthProp: $('#txt4').val() };
iSerialize.push(class2);
}
$('input').val('');
});
$('#btnSubmitBatch').click(function ()
{
var data = "{jsonString:'" + JSON.stringify(iSerialize) + "'}";
console.log(data);
$.ajax(
{
type: "POST",
url: "default.aspx/DataList",
contentType: "application/json",
dataType: "json",
data: data,
success: function (data)
{
console.log('the post was successful');
console.log(data.d);
},
error: function (xhr)
{
console.log(xhr.status);
}
});
});
});
目前,如果用户将 FourthProp 文本框留空,则应创建 Class1 对象,如果用户将 ThirdProp 文本框留空,则应创建 Class2 对象。我当前的 Web 服务方法如下所示:
[WebMethod]
public string DataList(string jsonString)
{
var jss = new JavaScriptSerializer();
List<ISerialize> list = jss.Deserialize<List<ISerialize>>(jsonString);
//some members might have different properties
//how to create a factory to create an instance based on the objects properties?
return list[0].FirstProp;
}
在其当前状态下,我收到一个错误:No parameterless constructor defined for type of DeserializeListOfInterfaceTypes.ISerialize. 这可以避免,并且程序将通过使List<ISerialize> 成为具体类型之一的列表来工作。所以在这种情况下,属性ThirdProp 或FourthProp 的存在决定了对象应该分别是Class1 还是Class2。如何使用 JavaScript 对象的属性来确定要创建的 C# 对象?
【问题讨论】:
标签: c# javascript jquery