【问题标题】:MVC 3 JSON Model binding not creating objectMVC 3 JSON模型绑定不创建对象
【发布时间】:2012-01-31 15:27:01
【问题描述】:

这是我第一次尝试 JSON MVC 模型绑定,但事情并没有按计划进行.... 叹了口气!在每次尝试中断控制器操作时,强类型模型/类要么为空,要么为空。

我做什么:

客户端我正在生成一个数组来存储付款

var PAYMENTS = new Array();

付款值由用户输入并添加到付款数组中。有些字段只有在发布数据后才会在服务器端填充,所以我分配临时值。(参考,用户 ID)

PAYMENTS.push({ reference: "0",
            paymentDate: date,
            paymentMethodID: paymentMethod,
            paymentAmount: amount,
            bankNameID: bankID,
            bankBranchCode: branch,
            drawerName: drawer,
            chequeNo: chequeNo,
            userID: "00000000-0000-0000-0000-000000000000",
            statementNo: statementNo,
            additionalReference: additionalRef
        });

添加 2 笔付款后,这是 PAYMENTS 的萤火虫结果

0 Object { reference="0", paymentDate="31-01-2012", paymentMethodID="7", more...}
1 Object { reference="0", paymentDate="31-01-2012", paymentMethodID="0", more...}

用户选择处理调用 processPayment() 的付款

实践是应该传递的第二个参数,但只是试图首先让付款工作。

function processPayment() {

    var paymentsJSON = $.toJSON(PAYMENTS);
//  var practicesJSON = $.toJSON(selectedPractices);

    $.ajax({
        url: BASE_APP_URL + "Payment/processPayment",
        type: 'POST',
        data: "{ param : '" + paymentsJSON + "'}" ,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (data) {
            alert(data);
        }
    });
}

viewModel 类。我已经简化了 viewModel 类型,试图将一些东西放入控制器中。

public class paymentsViewModelJSONPayment
{
    public string referece { get; set; }
    public string paymentDate { get; set; }
    public string paymentMethodID { get; set; }
    public decimal paymentAmount { get; set; }
    public string bankNameID { get; set; }
    public string bankBranchCode { get; set; }
    public string drawerName { get; set; }
    public string chequeNo { get; set; }
    public string userID { get; set; }
    public string statementNo { get; set; }
    public string additionalReference { get; set; }
}

最终控制器动作

[HttpPost]
public ActionResult processPayment(List<paymentsViewModelJSONPayment> param)
{
    return Json(param);

调试时:

从 Firebug 发布值:

JSON


param   "[{"reference":"0","paymentDate":"31-01-2012","paymentMethodID":"7","paymentAmount":500,"bankNameID":"8","bankBranchCode":"","drawerName":"","chequeNo":"","userID":"00000000-0000-0000-0000-000000000000","statementNo":"","additionalReference":""},{"reference":"0","paymentDate":"31-01-2012","paymentMethodID":"0","paymentAmount":500,"bankNameID":"10","bankBranchCode":"0026","drawerName":"drawer","chequeNo":"00231021","userID":"00000000-0000-0000-0000-000000000000","statementNo":"","additionalReference":""}]"

控制器中的断点。动作被调用但没有绑定。

还不允许发布图片,但是当破坏控制器列表为空时。

来自关注列表:

  • 参数计数 = 0 System.Collections.Generic.List
  • 原始视图容量 0 int Count 0 int
  • 静态成员
  • 非公共成员

我几乎没有想法,尝试了各种配置,但我尝试过的所有东西都数不清了。

非常感谢任何帮助。

谢谢大家。

【问题讨论】:

    标签: json asp.net-mvc-3


    【解决方案1】:

    尝试为paymentAmount 指定500.0。我喜欢使用 Fiddler2 来测试这样的东西:http://www.fiddler2.com/fiddler2/

    此链接阐明了绑定十进制值:http://digitalbush.com/2011/04/24/asp-net-mvc3-json-decimal-binding-woes/

    编辑:我使用您的类设置了一个测试项目,并且能够使用 Fiddler 将您的 JSON(但调整 paymentAmount)发布到控制器,没有任何问题。

    请求显示在顶部窗格中,响应(由 Fiddler 格式化为 JSON)显示在底部。

    您班级中的 referece 属性拼写错误,因此返回为 null

    【讨论】:

    • 我刚刚删除了我的答案,因为我刚刚看到 MVC3 现在完全能够将 JSON 绑定回一个对象,如果它是 post 操作中的唯一参数。如果您需要为您的 post 操作中的每个参数发生不同的绑定,而不是自定义 JSON 绑定器将适合,但我认为这对于这个问题来说是多余的,它可能就像 500.0 一样简单 :)。
    • 我尝试通过将金额类型设为“字符串”并将其作为字符串发布来更改模型,但没有成功。刚刚找到一个解决方案,将发布答案。
    【解决方案2】:

    我可以获得绑定到“参数”的值的唯一方法是将其定义为字符串。然后我使用 JavascriptSerializer 将其反序列化为我想要的对象。

    [HttpPost]
    public JsonResult processPayment(string param)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        try
        {
            List<paymentsViewModelJSONPayment> payments = serializer.Deserialize<List<paymentsViewModelJSONPayment>>(param);
    

    断点处的参数值

    "[{\"reference\":\"0\",\"paymentDate\":\"01-02-2012\",\"paymentMethodID\":\"7\",\"paymentAmount\":500,\"bankNameID\":\"8\",\"bankBranchCode\":\"\",\"drawerName\":\"\",\"chequeNo\":\"\",\"userID\":\"00000000-0000-0000-0000-000000000000\",\"statementNo\":\"\",\"additionalReference\":\"\"}]"
    

    VS watchlsit 中的支付值

        payments    Count = 1
    System.Collections.Generic.List<PCNS.viewModels.paymentsViewModelJSONPayment>
        [0] {PCNS.viewModels.paymentsViewModelJSONPayment}  PCNS.viewModels.paymentsViewModelJSONPayment
        additionalReference ""  string
        bankBranchCode  ""  string
        bankNameID  "8" string
        chequeNo    ""  string
        drawerName  ""  string
        paymentAmount   500 decimal
        paymentDate "01-02-2012"    string
        paymentMethodID "7" string
        referece    null    string
        statementNo ""  string
        userID  "00000000-0000-0000-0000-000000000000"  string
    

    看起来有点小技巧,但它确实有效。

    【讨论】:

    • 您是否尝试过使用 Fiddler 之类的东西将 JSON 更改为使用 paymentAmount: 500.0 来发布到您的控制器。请注意,我并不是建议您将paymentAmount 发布为string。如果您使用 Fiddler,则需要在标题中设置 Content-Type
    • 抱歉,戴夫,我不打算将 paymentAmount 作为字符串作为您的建议,我在阅读您的回复之前就这样做了。发布一个实际的十进制值也失败了(500.0、500.05),我显然遗漏了一些东西。暂时我会坚持我目前的解决方案,一旦我有更多的时间会重新审视。
    • 没问题,我只是想确保我的建议是明确的。你提供的类、JSON 和控制器 sn-p 对我来说都很好。我建议尝试使用 Fiddler 来消除客户端代码的任何问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多