2011-08-18 25 views
1

我试图解析一个简单的guid /字符串数组到json json被用作后调用我的控制器的参数。解析一个字符串数组到MVC方法

我一直在尝试很多不同的东西,但我只是不能让控制器的方法看到我的列表。

该阵列由复选框值构建:

$('input:checkbox').click(function() { 
     if ($(this).attr("checked") == true) { 
      selected.push($(this).val()); 
     } 
    }); 

,看起来没事。 然后我尝试将其转换成JSON

$(document).ready(function() { 
    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (i in selected) { 
      arrayJson[i] = selected[i]; 
     } 
     var json = { 
      SelectedQuantities: arrayJson 
     }; 

     $.ajax({ 
      url: "/MVC/Physical/SelectQuantities/@Model.TopID", 
      type: "POST", 
      data: JSON.stringify(json), 
      dataType: "json", 
      contentType: 'application/json', 
      success: function (result) { 
       debugger; 
       if (result.status == 200) 
        location.replace = "/MVC/Physical/QuantitySummaryView/@Model.TopID" 
       else { 
        //Handle error 
       } 

      } 
     }); 
    }); 
}); 

我的控制器方法看起来如下:

public ActionResult QuantitySummaryView(Guid id, List<String> SelectedQuantities) 

不过这个名单总是空。我想这是因为JSON列表不包含直接在它下面的GUID数组。

你能帮我把它推到原位吗?

JSON(由铬合金开发工具可以看到)看起来如下:

{ 
"SelectedQuantities": { 
    "0": "707c40bd-4434-41ed-80fd-4ac541a81e85", 
    "1": "a8d78a4b-b107-4e1c-97b5-5d8abf530ba8", 
    "2": "a19226cc-9b22-4174-97e3-bb003d4b2746" 
} 

}

+0

我不熟悉asp.net,但控制器期望参数来获取一个列表,但你的jQuery发布JSON字符串...不是一个列表。我会尝试将参数列表 SelectedQuantities更改为String SelectedQuantities并将json字符串转换为控制器中的LIst。希望帮助 – Cygnusx1

回答

1

我认为你是一个序列化的次数太多了,你有一个层次过多。试试这个:

我删除了一个SelectedQuantities,并更改ajax调用。

$(document).ready(function() { 
    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (i in selected) { 
      arrayJson[i] = selected[i]; 
     } 

     var json = { 
      SelectedQuantities: arrayJson 
     }; 

     $.ajax({ 
      url: "/MVC/Physical/QuantitySummaryView/@Model.TopID", 
      type: "POST", 
      data: JSON.stringify(json), 
      dataType: "json", 
      contentType: 'application/json' 
     }); 
    }); 
}); 

另外,尝试Firebug的,它会告诉你想传递给服务器,这样就可以确保创建并通过JSON是正确的。

+0

尝试执行此操作,但它仍然抱怨列表为空。 我用编辑好的代码更新了我的原始问题。你介意再看一遍吗? – mfriis

+0

奖金信息。我可以通过使用$ .post而不是字符串化来实现它。但它不通过AJAX工作,也没有或没有stringify。 $ .POST( “/ MVC/Physical/SelectQuantities/@Model.TopID”,JSON, 功能(数据){ location.href = “/MVC/Physical/QuantitySummaryView/@Model.TopID” } ); – mfriis

1

你并不需要字符串化JSON的你也不需要添加双SelectedQuantities

$(document).ready(function() { 
    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (var i in selected) { 
      arrayJson[i] = selected[i]; 
     } 

     var json = { 
      SelectedQuantities: arrayJson 
     }; 
     //json = JSON.stringify(json); 
     $.post("/Home/QuantitySummaryView/@Model.TopID", json, true); 
    }); 
}); 

然而,根据你的代码,你将只能得到物品托运的数量(所有的人都平等到“打开”)您没有任何代码可以传递被检查项目的名称,也不会传递未检查项目的名称。所以你可能不得不改变你的代码来处理名称/值对。

+0

谢谢你:)这样一个小但重大的错误。 我不需要名称,我需要的只是指导。 – mfriis

0

例如:

其中包含的GUID的集合的模型:

<% var index = 1; %> 
    <% foreach(var guid in Model.Guids) { %> 
     <input type="checkbox" value="<%= guid %>" name="guid<%= index %>" /> 
    <%: guid %> 
    <br /> 
    <% index++; %> 
<% } %> 
<br /> 
<input type="button" value="Summarize" id="Summarize" />  

中的JavaScript/jQuery的:

public class GuidModel 
{ 
    public GuidModel() 
    { 
     Guids = new List<Guid>(); 

     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
     Guids.Add(Guid.NewGuid()); 
    } 

    public IList<Guid> Guids { get; set; } 
} 

的复选框被视图中呈现

<script type="text/javascript"> 
    var selected = []; 

    $('input:checkbox').click(function() { 
     if ($(this).attr("checked") == true) { 
      selected.push($(this).val()); 
     } 
    }); 

    $('#Summarize').click(function() { 
     var arrayJson = {}; 
     for (i in selected) { 
      arrayJson[i] = selected[i]; 
     } 

     var json = { 
      SelectedQuantities: arrayJson 
     }; 
     json = JSON.stringify(json); 

     $.post("/Home/QuantitySummaryView?data=" + json); 
    }); 
</script> 

控制器中的操作方法:

[HttpPost] 
public ActionResult QuantitySummaryView(string data) 
{ 
    // Deserialize the string containing JSON serialized data 
    JavaScriptSerializer jss = new JavaScriptSerializer();  
    //... 
}