簡単そうな質問ですが、本当に難しい質問です。
私はこのようなものを書きました
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class UIService : System.Web.Services.WebService
{
public UIService () {
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod(EnableSession=true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[System.Security.Permissions.PrincipalPermission(System.Security.Permissions.SecurityAction.Demand, Authenticated = true)]
public Accordion ConstructAccordian(string accordionId)
{
Accordion result = new Accordion();
result.Name = "MenuAccordion";
AccordionItem item1 = new AccordionItem("Test");
item1.Items.Add(new MenuItem("User", "UserList"));
item1.Items.Add(new MenuItem("OnlineUser", "OnlineUser"));
result.Items.Add(item1);
return result;
}
function get(url, pdata, func) {
var msg = "Exception";
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: url,
data: JSON.stringify(pdata),
dataType: "json",
async: true,
success: function (data, textStatus) {
if (textStatus == "success") {
if (data.hasOwnProperty('d')) {
msg = data.d;
} else {
msg = data;
}
func(msg);
}
},
error: function (data, textStatus) {
get(MEMBERSHIP_SERVICE_AUTHCHCK_URL, {}, function (msg) {
if (msg.error == true) {
window.location = PORTAL_LOGIN_URL;
}
else {
get(url, pdata, func);
}
});
}
});
}
正常に動作します。しかし、アコーディオンのプロパティがnullの場合。そのプロパティはJSON文字列に表示され、その値はnullです。System.Web.Script.Services.ScriptServiceで使用されるJavaScriptSerializerがnullプロパティを無視するため、json文字列で生成しないようにします。私はたくさん検索しましたが、JavaScriptSerializerではこれができないと思います。JavaScriptSerializerを変更する簡単な方法はありますか?たとえば、ScriptServiceのデフォルトのformmaterとして代わりにJSON.netを使用しますか、またはJSONにシリアル化するときにnullプロパティの生成を無視するにはどうすればよいですか?