Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
550 views
in Technique[技术] by (71.8m points)

asp.net mvc - Transmit javascript object into controller action as dictionary

Is there a way to pass this javascript object

Object { 35=true, 179=true, 181=true}

into a controller action as

Dictionary<int, bool>

I've checked the following methods:

    var remoteUrl = "@Url.Action("UpdateProjectStructureSelection")" + "?tlpId=@Model.TopLevelProjectId";
    $.post(remoteUrl, mapSiteSelectionChoices, function(callbackResult) {
        alert(callbackResult);
    });

and

    var remoteUrl = "@Url.Action("UpdateProjectStructureSelection")" + "?tlpId=@Model.TopLevelProjectId";
    $.post(remoteUrl, { values : mapSiteSelectionChoices }, function(callbackResult) {
        alert(callbackResult);
    });

However in both cases

public ActionResult UpdateProjectStructureSelection(int tlpId, Dictionary<int, bool> values)

has been called, but values was empty.

Since i've transfered more complex types into a controller action without writing a custom model binder i've been wondering whether i'm just doing something wrong here.

Is a custom model binder the only way here to get it as dictionary? (other than using JsonConvert + stringify on clientside)

Addition (This works but i'd love to avoid extra code) :

    public ActionResult UpdateProjectStructureSelection(int tlpId, string values)
    {
        var dict = JsonConvert.DeserializeObject<Dictionary<int, bool>>(values);
    }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Not with the object in that format. It would need to be in the following format to be used by the DefaultModelBinder

var data = { 'dict[0].key': '35', 'dict[0].value': 'True', 'dict[1].key': '179', 'values[1].value': 'True', dict[0].key': '8', 'dict[0].value': 'True' };
$.post(remoteUrl, data, function(callbackResult) {

and the controller

public ActionResult UpdateProjectStructureSelection(Dictionary<int, bool> dict)

As you noted, another option is to use a custom ModelBinder, for example this answer


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...