使用$ .get和@编码问题发布复杂模型(Html.Raw(Json.Encode(model)))

时间:2011-10-20 04:48:24

标签: json asp.net-mvc-3 jquery

我有一个应用程序,它使用$ .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 个答案:

答案 0 :(得分:3)

如果要发送复杂对象,可以使用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方法将model javascript模型变量序列化为要发送到控制器操作的JSON字符串。此方法本身内置于现代浏览器中,但如果您想支持旧版浏览器,则可能需要在页面中包含json2.js脚本。