Доступ к свойствам объекта JSON непосредственно на стороне клиента - PullRequest
1 голос
/ 04 февраля 2012

Мне было поручено преобразовать одностраничное веб-приложение ASP.NET MVC 3 в приложение ASP.NET 3.5 Web Forms из-за некоторой несовместимости с Sharepoint.Я не могу получить доступ к свойству объекта в json результате приложения веб-форм.Может кто-нибудь сказать мне, что я делаю не так?Кроме того, лучше ли использовать службу WCF или обычный веб-сервис при использовании веб-форм для возврата данных JSON?Кто-нибудь может дать мне несколько примеров?Лучше использовать встроенный сериализатор Javascript или библиотеку JSON.net?Вот мой код -

метод MVC -

public ActionResult LoadPerson()
{
   var p = new Person;
   p.Name = "Bob";    
   return Json(new { value = p}, JsonRequestBehavior.AllowGet); //what is the equivalent of this in webforms so I can access the properties directly?
}

Файл JavaScript MVC -

var person;
    $.ajax({
            url: 'Home/LoadPerson',           
            type: 'GET',
            async: false,
            contentType: 'application/json;',
            dataType: 'json',
            success: function (result) {
                person = result.value;
            }
        });
alert(person.Name); //works fine.

Код веб-форм -

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public static string LoadPerson()
    {
        var p = new Person();
        p.Name = "Bob";                
        var serializer = new JavaScriptSerializer();
        return serializer.Serialize(p);
    }

JavaScript веб-форм -

var person;
     $.ajax({
            url: 'Default.aspx/LoadPerson',
            type: 'POST',  
            async: false,
            contentType: 'application/json;',
            dataType: 'json',
            success: function (result) {
                person = result.d;
            }
        });

alert(person.Name); //undefined. Why?

1 Ответ

1 голос
/ 04 февраля 2012

Ваша проблема связана с ручным JSON-сериализацией ответа от вашего метода страницы.После запуска JSON.parse() в ответе от вашей службы jQuery остается со строкой JSON вместо объекта со свойствами, такими как .Name.

ASP.NET автоматически обрабатывает этот шаг (используя JavaScriptSerializer внутри себя, не меньше).Если вы просто возвращаете объект и позволяете ASP.NET обрабатывать перевод, он должен работать так, как вы ожидаете:

[WebMethod]
public static Person LoadPerson()
{
    var p = new Person();
    p.Name = "Bob";                

    return p;
}

Более подробное объяснение см. В этом посте: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/


Пока вы меняете код, я рекомендую избегать подхода async: false.Поскольку JavaScript работает в едином общем потоке и совместно использует этот поток с рендерингом пользовательского интерфейса в большинстве браузеров, любой синхронный код создает целый ряд проблем с производительностью.Это может даже привести к тому, что ваш сценарий отобразит диалоговое окно без ответа, предоставив пользователям возможность отменить его выполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...