MVC3和JSON模型绑定

时间:2014-01-16 23:28:28

标签: c# jquery asp.net-mvc asp.net-mvc-3

似乎无法弄清楚为什么这不起作用。我正在尝试使用javascript / jquery将数据发布到MVC控制器。涉及的两个模型类,“Order”和“Item”如下所示,控制器和客户端javascript也是如此。奇怪的是,menuID和mealID字段绑定正确; items数组具有正确数量的对象(在此示例中为2),但没有项目字段。相反,它们保持为空(或在双打的情况下为0)。

我尝试在JSON.stringify中包装数据但是它根本不起作用。还尝试在javascript对象中添加显式对象定义,如某些帖子所推荐的那样,如

    var order = {
        "order": {
            "menuID": $('#menuID').val(),
            "mealID": $('#mealID').val(),
            "items": items
        }
    };

但这也不起作用。我在字段中找不到任何拼写错误。最后,我查看了Firebug中的items数组,它看起来与我期望的完全一样:

[Object { desc="ham and cheese", cost="5.5", qty="1"}, Object { desc="soup", cost="2.25", qty="2"}]

关于问题可能是什么的任何理论?感谢。

public class OrderModel
{
    public string menuID { get; set; }
    public string mealID { get; set; }
    public List<MenuItem> items { get; set; }
}

public class OrderItem
{
    public string desc { get; set; }
    public double cost { get; set; }
    public double qty { get; set; }
}

[HttpPost]
public ActionResult Create(Models.OrderModel order)
{
    try
    {
        // TODO: Add insert logic here

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

使用Javascript:

<script type="text/javascript">

    function onPlaceOrder() {
        var x = validate();
        if (x.isValid)
            submit(x.items);
    }

    function submit(items) {
        var order = {
            menuID: $('#menuID').val(),
            mealID: $('#mealID').val(),
            items: items
        };
        $.post("/Order/Create", order);
    }

    function validate() {
        items = [];
        var isValid = true;
        var regex_qty = new RegExp(/^\d*(\.\d{1,2})?$/);
        $('#orderItems tbody tr').each(function () {
            var msg = "";
            var x = $(this).find('span[name=desc]');
            var desc = $(this).find('span[name=desc]').html().trim();
            var cost = $(this).find('span[name=cost]').html().trim();
            var qty = $(this).find('input[name=qty]').val().trim();

            if (regex_qty.test(qty) == false) {
                msg += "Invalid or missing quantity. ";
                isValid = false;
            }

            $(this).find('span[name=msg]').html(msg);

            items.push({ "desc": desc, "cost": cost, "qty": qty });
        });

        return {"isValid":isValid, "items":items};
    }

</script>

2 个答案:

答案 0 :(得分:0)

使用以下内容替换$ .post:

$.ajax({
    url: '/Order/Create',
    dataType: 'json',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(order)
});

我在一个干净的MVC3项目中对此进行了测试。但是,我必须修改您的OrderModel以包含List<OrderItem>而不是List<MenuItem>

P.S。某些较旧的浏览器可能没有JSON.stringify的原生支持,因此您可能希望使用其他内容。

答案 1 :(得分:0)

我认为您的问题可能与应用程序的文化有关,我可以指出您的模型具有双重值,并使用以下值5.52.25尝试设置网络。配置文化,允许处理这种值

<configuration>
   <system.web>
      <globalization culture="" uiCulture=""/>
  </system.web>