繁体   English   中英

MVC3和JSON模型绑定

[英]MVC3 and JSON model binding

似乎无法弄清楚为什么它不起作用。 我正在尝试使用javascript / jquery将数据发布到MVC控制器。 下面显示了涉及的两个模型类“ Order”和“ Item”,以及控制器和客户端javascript。 奇怪的是menuID和mealID字段正确绑定; items数组具有正确数量的对象(在此示例中为2),但没有item字段。 取而代之的是,它们保持为空(在双精度情况下为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>

将$ .post替换为以下内容:

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

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

PS一些较旧的浏览器可能没有对JSON.stringify本机支持,因此您可能想使用其他东西。

我觉得你的问题,它可能与应用程序的文化相关,我可以指出你的模型具有双重价值,具有以下值5.52.25尝试设置web.config中文化,让来处理这种价值观

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM