rod*_*dbv 180 asp.net-mvc jquery json
我正在创建一个小应用程序来自学ASP.NET MVC和JQuery,其中一个页面是一个项目列表,其中一些可以选择.然后我想按下一个按钮并使用JQuery的Post函数向我的控制器发送一个List(或类似的东西),其中包含所选项目的ID.
我设法得到一个数组,其中包含所选元素的ID,现在我想发布它.我可以这样做的一种方法是在我的页面中有一个虚拟表单,带有隐藏值,然后使用所选项目设置隐藏值,并发布该表单; 不过,这看起来很狡猾.
有没有更简洁的方法来实现这一点,通过将阵列直接发送到控制器?我尝试了一些不同的东西,但看起来控制器无法映射它接收的数据.这是迄今为止的代码:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
Run Code Online (Sandbox Code Playgroud)
然后我的控制器看起来像这样
public ActionResult GenerateList(List<string> values)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
我设法获得的只是控制器参数中的"null"...
有小费吗?
MrD*_*pan 243
我修改了我的回复以包含我所做的测试应用程序的代码.
更新:我已经更新了jQuery以将'traditional'设置为true,因此这将再次起作用(根据@DustinDavis的回答).
首先是javascript:
function test()
{
var stringArray = new Array();
stringArray[0] = "item1";
stringArray[1] = "item2";
stringArray[2] = "item3";
var postData = { values: stringArray };
$.ajax({
type: "POST",
url: "/Home/SaveList",
data: postData,
success: function(data){
alert(data.Result);
},
dataType: "json",
traditional: true
});
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器类中的代码:
public JsonResult SaveList(List<String> values)
{
return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}
Run Code Online (Sandbox Code Playgroud)
当我调用那个javascript函数时,我会收到一条警告:"列表中的第一项:'item1'".希望这可以帮助!
Dus*_*vis 107
仅供参考:JQuery改变了他们序列化发布数据的方式.
http://forum.jquery.com/topic/nested-param-serialization
另外,您必须将"传统"设置设置为true
{ Values : ["1", "2", "3"] }
Run Code Online (Sandbox Code Playgroud)
会出来的
Values[]=1&Values[]=2&Values[]=3
Run Code Online (Sandbox Code Playgroud)
代替
Values=1&Values=2&Values=3
Run Code Online (Sandbox Code Playgroud)
Evg*_*nii 24
谢谢大家的答案.另一个快速解决方案是使用传统参数设置为true的jQuery.param方法将JSON对象转换为字符串:
$.post("/your/url", $.param(yourJsonObject,true));
Run Code Online (Sandbox Code Playgroud)
不要将数据作为数组发布. 要绑定到列表,应为每个键提交具有相同值的键/值对.
您不应该需要表单来执行此操作.您只需要一个键/值对列表,您可以在$ .post的调用中包含这些键/值对.
在.NET4.5
,MVC 5
使用Javascript:
JS中的对象:
发布的机制.
$('.button-green-large').click(function() {
$.ajax({
url: 'Quote',
type: "POST",
dataType: "json",
data: JSON.stringify(document.selectedProduct),
contentType: 'application/json; charset=utf-8',
});
});
Run Code Online (Sandbox Code Playgroud)
C#
对象:
public class WillsQuoteViewModel
{
public string Product { get; set; }
public List<ClaimedFee> ClaimedFees { get; set; }
}
public partial class ClaimedFee //Generated by EF6
{
public long Id { get; set; }
public long JourneyId { get; set; }
public string Title { get; set; }
public decimal Net { get; set; }
public decimal Vat { get; set; }
public string Type { get; set; }
public virtual Journey Journey { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}
Run Code Online (Sandbox Code Playgroud)
收到的对象:
希望这能为您节省一些时间.
另一个也使用对象列表的实现,而不仅仅是字符串:
JS:
var postData = {};
postData[values] = selectedValues ;
$.ajax({
url: "/Home/SaveList",
type: "POST",
data: JSON.stringify(postData),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(data){
alert(data.Result);
}
});
Run Code Online (Sandbox Code Playgroud)
假设“selectedValues”是对象数组。
在控制器中,参数是对应的 ViewModel 的列表。
public JsonResult SaveList(List<ViewModel> values)
{
return Json(new {
Result = String.Format("Fist item in list: '{0}'", values[0].Name)
});
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
208442 次 |
最近记录: |