如何在没有表单的情况下将字符串数组发布到ASP.NET MVC Controller?

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'".希望这可以帮助!

  • 这里有两件重要的事情需要注意.1)dataType:"json"2.)traditional:true.没有它们的字符串数组不会被传递给动作方法 (41认同)
  • @Thanigainathan`dataType:'json'`用于返回类型,不需要将数组发送到Action.`contentType:"application/json; charset = utf-8"`是一个,但在某些情况下,这不是必需的. (7认同)
  • 我发现这个答案很好,现在我能够发送Guid的数组,并将Action接收到List <Guid>.谢谢 (2认同)

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)

  • 这让我有点困惑.设置`$ .ajax({...,traditional:true});`将有助于恢复传统的序列化. (8认同)

Evg*_*nii 24

谢谢大家的答案.另一个快速解决方案是使用传统参数设置为true的jQuery.param方法将JSON对象转换为字符串:

$.post("/your/url", $.param(yourJsonObject,true));
Run Code Online (Sandbox Code Playgroud)


Cra*_*ntz 9

不要将数据作为数组发布. 要绑定到列表,应为每个键提交具有相同值的键/值对.

您不应该需要表单来执行此操作.您只需要一个键/值对列表,您可以在$ .post的调用中包含这些键/值对.

  • 谢谢.更新的网址是:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx (3认同)

Mat*_*ius 6

.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)

收到的对象:

在此输入图像描述

希望这能为您节省一些时间.


d.p*_*pov 5

另一个也使用对象列表的实现,而不仅仅是字符串:

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)