Проблема кодирования при публикации сложной модели с использованием $ .get и @ (Html.Raw (Json.Encode (model))) - PullRequest
2 голосов
/ 20 октября 2011

У меня есть приложение, которое использует $ .get для переключения разделов страницы между страницами редактирования и просмотра.

(в этом примере я передаю всю модель, потому что она облегчает чтение кода)

$.get(@(Html.Raw(Json.Encode(Url.Action("_Table")))),
        @(Html.Raw(Json.Encode(Model))),
        function (data) { $('#@(Model.Guid)').empty().append(data)}
    );

Проблема в том, что хотя простые атрибуты (int, string и т. Д.) Передаются обратно в действие штраф, любой сложный объект не передается обратно правильно.

Я использовал Request.QueryString.ToString (), чтобы увидеть, что передается действию, и это получено.

{Guid=e1207e1c-78b6-4592-ab49-3ab9fa43a0e3&ExecuteSearch=True&ShowSearch=True&AllowExport=True&SearchData%5bId%5d=0&SearchData%5bName%5d=tes&SearchData%5bHostname%5d=null&SearchData%5bDescription%5d=null&SearchData%5bisActive%5d=false}

Я ожидал

{Guid=0d7cfe4d-c75f-40fb-ba9a-faee58abfeaa&ExecuteSearch=True&ShowSearch=True&AllowExport=True&SearchData.Id=&SearchData.Name=tes&SearchData.Hostname=&SearchData.Description=}

Примечание "SearchData.Id" вместо "SearchData% 5bId% 5d ="

Вот модель.

public class VM_List
{
    public Guid Guid { get; set; }
    public Boolean ExecuteSearch { get; set; }
    public Boolean ShowSearch { get; set; }
    public Boolean AllowExport { get; set; }
    public Boolean MultiEdit { get; set; }
    public String Title { get; set; }
    public String NewText { get; set; } //If null then link is not shown
    public dynamic SearchData { get; set; }
    public dynamic Data { get; set; }

    public VM_List(Guid Guid, Boolean ExecuteSearch, Boolean ShowSearch, Boolean AllowExport, Boolean MultiEdit, String Title, String NewText, dynamic SearchData, dynamic Data)
    {
        this.Guid = Guid;
        this.ExecuteSearch = ExecuteSearch; 
        this.ShowSearch = ShowSearch;
        this.AllowExport = AllowExport;
        this.MultiEdit = MultiEdit;
        this.Title = Title;
        this.NewText = NewText;
        this.SearchData = SearchData;
        this.Data = Data;
    }
}

Кто-нибудь имеет какие-либо идеи о том, что вызывает ошибку кодирования?

1 Ответ

3 голосов
/ 20 октября 2011

Вы можете использовать JSON-запрос, если хотите отправить сложные объекты:

var url = '@Url.Action("_Table")';
var model = @Html.Raw(Json.Encode(Model));

$.ajax({
    url: url,
    type: 'POST',
    data: JSON.stringify(model),
    contentType: 'application/json; charset=utf-8',
    success: function(result) {
        $('#' + model.Guid).empty().append(result);
    }
});

Метод JSON.stringify сериализует переменную модели javascript model в строку JSON для отправки в действие контроллера. Этот метод изначально встроен в современные браузеры, но если вы хотите поддерживать устаревшие браузеры, вам может потребоваться включить скрипт json2.js на свою страницу.

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