Беше открита кръгова препратка при сериализиране с Json.Encode

Имам ситуация, при която Json.Encode работи локално (localhost), което е 64-битова iis7 кутия за Windows 7.

Ако разположа в Windows 2003 32 bit IIS6, получавам кръгови референтни грешки. Показаният по-долу „Грешка тук“ е редът, от който започва грешката.

@*var model = '@Html.Raw(Json.Encode(Model))';*@ <<<<Error here
var model = '@Html.GetJson(Model)';

Като част от опита си да разреша това, си помислих, че може би един от проектните dll файлове, които се използват на сървъра, е различен от този локално, така че копирах всички референтни dll в директорията bin на сървъра. Това не помогна.

Имам решение, което е доста лесно. Бих предпочел да мога да идентифицирам проблема. Предполагам, че използва някаква dll на сървъра различно от локално, за да върне json чрез Json.Encode след това на сървъра.

Моята резолюция, както е показано на 2-ри ред по-горе, е да използвам Json.Net и mvc помощник

public static MvcHtmlString GetJson(this HtmlHelper htmlHelper, ViewModel vm)
{
    string s = JsonConvert.SerializeObject(vm);
    return new MvcHtmlString(s);
}

Някой виждал ли е това и разрешавал ли е? (без json.net)


person David    schedule 06.08.2013    source източник
comment
Моля, проверете този отговор: stackoverflow.com/questions/1153385/   -  person ClayKaboom    schedule 13.11.2013


Отговори (1)


Ако приемем, че използвате Entity Framework, разглеждането на обектите, разработени от рамката, ще хвърли малко светлина върху темата. Например, имах таблица, наречена Sessions и една, наречена Enrollments, като таблицата Enrollments има връзка FK с таблицата Sessions PK. Това доведе до това, че обектите Session имат колекция от записвания, а обектите Enrollment имат виртуален екземпляр на сесията, за която е записването ... което от своя страна сочи към колекция от записвания и т.н. ... получавате картината, И защо проблемът с кръговата препратка е открит от json сериализацията.

Решението беше да НЕ се прави заявка за колекция от сесийни обекти в кода, а вместо това да се прави заявка към анонимен (нетипизиран) обект с всички същите полета в него. Предотвратява Json.Encode() да се обърква, тъй като не знае за кръговата препратка, с която Entity Framework е ОК в кода зад / кода от страната на сървъра.

person IdahoB    schedule 17.05.2018