【问题标题】:MVC model binding a string array from jQuery postMVC模型从jQuery post绑定一个字符串数组
【发布时间】:2012-07-19 22:34:29
【问题描述】:

参数string[] orderTypeNames 即将为空。

mvc 动作

public PartialViewResult EditMultipleOrderStates(
    string[] orderTypeNames,
    int[] orderIds)

javascript

$('#edit-mulitple-order-states-button').click(function () {
    ids = [];
    types = [];
    $checked = $('.order-queue-order input:checked');
    $orders = $checked.closest('.order-queue-order');
    $orders.each(function (index, elem) {
        $order = $(elem);
        ids.push($order.attr("orderId"));
        types.push($order.attr("orderType"));
    });
    data = {
        orderIds: ids,
        orderTypeNames: types
    };
    $.post('EditMultipleOrderStates', data, function (response) {
        //...
    });
});

提琴手

orderIds%5B%5D=97&orderIds%5B%5D=98&orderIds%5B%5D=93&orderTypeNames%5B%5D=DeliveryOrder&orderTypeNames%5B%5D=DeliveryOrder&orderTypeNames%5B%5D=DeliveryOrder

是方括号引起的问题吗?如何绑定到这些数组?

编辑:同时我正在手动构建查询字符串。

query = "";
for each...
query += "orderIds=" + $order.attr("orderId") + "&";
query += "orderTypeNames=" + $order.attr("orderType") + "&";

【问题讨论】:

标签: c# javascript jquery asp.net-mvc model-binding


【解决方案1】:

您需要在数据上调用某种JSON.stringify

 $.post('EditMultipleOrderStates', JSON.stringify(data), function (response) {
        //...
    });

【讨论】:

  • 它仍然没有绑定。这会产生{"orderIds":["97","98","99"],"orderTypeNames":["DeliveryOrder","DeliveryOrder","DeliveryOrder"]}。我应该在 mvc 操作参数中更改什么内容吗?
【解决方案2】:

@本杰明。这是我所做的更详细的示例,它有效

<script type="text/javascript">
    $(document).ready(function() {
        $('#btnTest').click(function() {

            var filter = {
                OrgId: 3,
                Drivers: [{ Name: "SGT-200" }, { Name: "SGT-100"}],
                DrivenUnits: [{ Name: "Generator" }],
                Regions: [{ Name: "REU" }],
                SearchString : "Test search string"
            };

            $.ajax(
                {
                    url: "/api/Dashboard/PostFilter",
                    type: "POST",
                    contentType: "application/json",
                    dataType: "json",
                    data: JSON.stringify(filter),
                    success: function(result) {
                        alert(result);
                    },
                    error: function(error) {

                        alert("There was an error posting the data to the server: " + error.responseText);

                    }
                });
        });
    });
</script>

希望这会有所帮助。

编辑:这里是匹配的 C# 对象

public class Filter
{
    public int OrgId { get; set; }
    public List<FilterData> Drivers { get; set; }
    public List<FilterData> DrivenUnits { get; set; }
    public List<FilterData> Regions { get; set; }
    public List<FilterData> Operations { get; set; }
    public List<FilterData> Connections { get; set; }
    public string SearchString { get; set; }
}

public class FilterData
{
    public string Type { get; set; }
    public string Name { get; set; }
    public int Count { get; set; }
}

所有类型名称都需要匹配。下面是接收调用的代码

public IQueryable<DashboardData> Post(Filter filter) {
        using(_unitOfWork)
        {
            _dashboardRepository.UsingUnitOfWork(_unitOfWork);

            return FilterDashboardData(_dashboardRepository.GetDashboardData(filter.OrgId), filter);
        }
    }

【讨论】:

  • 谢谢。这看起来有点类似于 scottm 推荐的调用 stringify 的结果。 MVC 似乎不想绑定到 json。控制器中是否需要做一些事情才能绑定到 json 数组?
  • @Benjamin。我已按原样使用此代码,并进行了一些更改,跨域,并且没有问题。在这种情况下,我将拥有一个具有适当属性的 C# Filter 对象。我将添加 C# 类,以便您了解会发生什么。如果您的映射不起作用,那么在数据类型/名称方面,您的对象类可能有问题
  • 与默认的 asp.net mvc 模型绑定相比,这听起来有点复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多