当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在没有表单的情况下将字符串数组发布到ASP.NETMVCController?》经验,为你挑选了5个好方法。

我正在创建一个小应用程序来自学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");
}

然后我的控制器看起来像这样

public ActionResult GenerateList(List values)
{
    //do something
}

我设法获得的只是控制器参数中的"null"...

有小费吗?



1> MrDustpan..:

我修改了我的回复以包含我所做的测试应用程序的代码.

更新:我已经更新了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
    });
}

这是我的控制器类中的代码:

public JsonResult SaveList(List values)
{
    return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}

当我调用那个javascript函数时,我会收到一条警告:"列表中的第一项:'item1'".希望这可以帮助!


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

2> Dustin Davis..:

仅供参考:JQuery改变了他们序列化发布数据的方式.

http://forum.jquery.com/topic/nested-param-serialization

另外,您必须将"传统"设置设置为true

{ Values : ["1", "2", "3"] }

会出来的

Values[]=1&Values[]=2&Values[]=3

代替

Values=1&Values=2&Values=3


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

3> Evgenii..:

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

$.post("/your/url", $.param(yourJsonObject,true));



4> Craig Stuntz..:

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

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


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

5> Matas Vaitke..:

.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',
        });
    });

C#

对象:

public class WillsQuoteViewModel
{
    public string Product { get; set; }

    public List 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; }
}

控制器:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}

收到的对象:

在此输入图像描述

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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有