ASP.NET MVC中WebMethod的不规则响应模式

时间:2018-02-09 08:10:05

标签: c# ajax asp.net-mvc webmethod

旧的ASP.NET WebForms项目正在迁移到ASP.NET MVC。 ASP.NET MVC Web应用程序包含许多ASPX页面。 WebMethods保存在ASPX页面的代码隐藏文件中。对WebMethod进行AJAX调用以使用jQuery获取响应。

对于初始迁移,我们希望保留旧的ASP.NET WebForms,并希望在MVC(Razor页面)中添加新页面。渐渐地,旧的WebForms将转换为MVC。

以下是使用的WebMethod示例:

[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string GetMenu()
{
  return Utility.CreateMenu();
}

jQuery AJAX调用完成如下:

$.ajax({
    url: 'default.aspx/GetMenu',
    type: 'GET',
    data: '{}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    beforeSend: function () {           
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
    },
    success: function (data, textStatus) {
    },
    complete: function (XMLHttpRequest, textStatus) {
    }
});

我们对WebMethod响应有一种奇怪的行为。响应有时作为JSON对象返回,有时候是一个用" d"宾语。

用" d"包裹的字符串例如:

{"d":"[{\"SubItems\":null,\"MenuState\":\"2\",\"Description\":\"Create issue\",\"Url\":\"default.aspx?id=1234\"}]"}

JSON响应示例:

{SubItems: null, MenuState: "2", Description: "Create issue", Url: "default.aspx?id=1234"}

以前,当没有添加ASP.NET MVC时,它会将响应作为字符串包含在" d"宾语。

备注

  • WebMethod响应模式是随机的。有时它会返回包裹在" d"有时候是纯粹的JSON。
  • 对MVC Action的AJAX调用始终返回JSON响应。
  • 最初在MVC中,WebMethod无法正常工作,因为路径正在提供404 URL。我们在RouteConfig中添加了ignore route。 routes.IgnoreRoute("{aspxpage}.aspx/{*webmethod}");
  • WebMethod返回序列化的字符串,如:new JavaScriptSerializer().Serialize(model);
  • 获取AJAX响应后,解析字符串以获取JSON 有时失败的对象。 var obj = JSON.parse(response.d);

有没有办法强制WebMethod返回用" d"包裹的字符串?宾语?或者其他任何方式如何处理这个问题?

0 个答案:

没有答案