从c#列表中删除多余的对象<object>从asp.net Webform返回json响应

问题描述 投票:0回答:1

我是 ASP.NET WebForm 的新手。我有很多问题,几乎我从StackOverflow得到了解决方案。但现在我面临一个问题,无法得到任何想要的解决方案,所以,我正在写这个问题。 我想要一个文本框通过 JQuery 自动完成调用自动完成。我有两个文本框,一个用于自动完成建议列表,另一个用于获取所选项目 ID。我不知道现代网站是如何做到这一点的。但幸运的是,我通过谷歌搜索得到了提示。

这里我创建了一个代码隐藏[WebMethod]属性Method:

// Class for Custom datatype object
public class MyData
{
    public int Id { get; set; }
    public string Value { get; set; }
}

// Webmethod for call from ajax
[WebMethod]
public static MyData GetDataList()
{
    int id = 123;
    string value = "My Name";
    return new MyData { Id = id, Value = value };
}

这是我的 JQuery 函数。

$(function () {
    $("#autocomplete").autocomplete({
        source: function (request, response) {
            $.ajax({
                type: 'POST',
                url: 'reissue_ticket.aspx/GetDataList',
                data: '{ "term": "' + request.term + '" }',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                success: function (data) {
                    response(data.d);
                },
                error: function () {
                    console.log('Error fetching items.');
                }
            });
        },
        minLength: 1,
        select: function (event, ui) {
            // Set the selected value and id into textboxes
            $('#selectedValue').val(ui.item.value);
            $('#selectedId').val(ui.item.id);
        }
    });
});

工作正常,但问题是我得到了 3 个对象响应。喜欢:

json respose text

{
    "d": {
        "__type": "eLedger.com.Pages.Services.reissue_ticket+MyData",
        "Id": 123,
        "Value": "My Name"
    }
}

我不想要“__type”:“eLedger.com.Pages.Services.reissue_ticket+MyData”。我在 C# 中尝试过 Json Serialized,但没有任何效果。

请有人帮助我解决这个问题或使用网络表单获得任何更好的想法。

至少提前感谢您阅读我的问题。

我只想要像 {"Id":1, "Value": "My Name"} 这样的响应。

c# asp.net ajax
1个回答
0
投票

您的公共功能已经“自动”输入为“MyData”

是的,内置序列化器始终包含对象类型,并且它始终返回返回对象的 .d 部分中的数据。

此外,您的 .ajax 调用正在传递数据,这意味着函数签名应该匹配(您正在传递“term”)。

那么,说一下这个方法:

    [WebMethod]
    public static MyData GetDataList(string term)
    {
        int id = 123;
        string value = "My Name " + "(" + term + ")";

        return new MyData { Id = id, Value = value };
    }

那么,在客户端,那么:

  <input id="Button1" type="button" value="test"
      onclick="testm();return false";
      />
  <script>

      function testm() {

          var MyTerm = "abc";
          $.ajax({
              type: 'POST',
              url: 'AjaxTest41.aspx/GetDataList',
              data: '{ "term": "' + MyTerm + '" }',
              contentType: 'application/json; charset=utf-8',
              dataType: 'json',
              success: function (data) {

                  console.log(data)
                  console.log(data.d.Id)
                  console.log(data.d.Value)
              },
              error: function () {
                  console.log('Error fetching items.');
              }
          });
      }

  </script>

结果:

请注意,我们必须在返回值前加上“.d”前缀。

.net 已经这样做了 20 年,作为一种安全措施,它总是以“.d”返回有效负载。

是的,总是返回对象类型,而且在 99% 的情况下,我们并不关心。

但是,如果您想控制返回的内容,有多种方法。您可以将Web方法函数设置为字符串,然后在服务器端序列化对象,然后在客户端再次序列化。 (我不太喜欢这样做,因为你做了双重序列化)。

如果您真的不想要额外的信息,并且不希望包含对象类型?您不想要 .d 有效负载吗?

然后简单地自己序列化对象,并且不要对 Web 方法进行强类型化。事实上,将方法标记为 void,然后返回任何你想要的内容。

因此,这样说:

          var MyTerm = "abc";
          $.ajax({
              type: 'POST',
              url: 'AjaxTest41.aspx/GetDataList2',
              data: '{ "term": "' + MyTerm + '" }',
              contentType: 'application/json; charset=utf-8',
              dataType: 'json',
              success: function (data) {

                  console.log(data)
                  console.log("Id = " + data.Id)
                  console.log("Value = " + data.Value)
              },
              error: function () {
                  console.log('Error fetching items.');
              }
          });

在服务器端,我们这样做:

    [WebMethod]
    public static void  GetDataList2(string term)
    {
        int id = 123;
        string value = "My Name " + "(" + term + ")";

        MyData MyResult = new MyData();
        MyResult.Id = id;
        MyResult.Value = value;

        JavaScriptSerializer myser = new JavaScriptSerializer();
        HttpContext.Current.Response.Write(myser.Serialize(MyResult));
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.End();
    }

现在客户端,我们有这个:

      function testm() {

          var MyTerm = "abc";
          $.ajax({
              type: 'POST',
              url: 'AjaxTest41.aspx/GetDataList2',
              data: JSON.stringify({term : MyTerm}),
              contentType: 'application/json; charset=utf-8',
              dataType: 'json',
              success: function (data) {

                  console.log(data)
                  console.log("Id = " + data.Id)
                  console.log("Value = " + data.Value)
              },
              error: function () {
                  console.log('Error fetching items.');
              }
          });
      }

输出:

请注意,我引入了 JSON.stringify,因为我不喜欢凌乱的串联,并且在上面,stringify 可以在上述所有示例中使用。

所以,我们可能会说:

  var sFirstName = "Albert"
  var sLastName = "Kallal"

那么数据就变成这样了:

              data: JSON.stringify({FirstName: sFirstName, LastName : sLastName}),

服务器端签名必须匹配,因此:

    [WebMethod]
    public static Whatever GetDataList(string FirstName, string LastName)
    {

注意,.net 4.7.2之前,建议您使用NewtonSoft的序列化器。

对于当前的 4.8,大多数情况下您可以使用内置的序列化器。

因此:

using System.Web.Script.Serialization;

因此,您可以将Web Metoid标记为void,并返回您想要的任何内容,上面将删除“.d”,并将删除对象类型的传递。

但是,在大多数情况下,甚至使用 jQuery.UI 的自动完成功能,然后在客户端代码中,您只需包含客户端代码的 .d,自动完成功能就可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.