15

我遇到了 json 绑定到视图模型的问题。这是我的代码:

我的 ViewModel 的一部分(AddressViewModel 有更多属性):

public class AddressViewModel
{
        [Display(Name = "Address_Town", ResourceType = typeof(Resources.PartyDetails))]
        public string Town { get; set; }

        [Display(Name = "Address_Country", ResourceType = typeof(Resources.PartyDetails))]
        public Country Country { get; set; }
}

public class Country : EntityBase<string>
{
        public string Name { get; set; }

        protected override void Validate()
        {
            if (string.IsNullOrEmpty(Name))
            {
                base.AddBrokenRule(new BusinessRule("CountryName", "Required"));
            }
        }
}

Javascript:

$(document).on("click", "#addAddress", function () {
            var jsonData = {
                "Town": $('#txt-Town').val(),
                "District": $('#txt-District').val(),
                "Street": $('#txt-Street').val(),
                "PostCode": $('#txt-PostCode').val(),
                "FlatNumber": $('#txt-FlatNumber').val(),
                "PremiseName": $('#txt-PremiseName').val(),
                "PremiseNumber": $('#txt-Premisenumber').val(),
                "Country": {
                    "Name": $('#txt-Country').val(),
                }
            };
            var addressData = JSON.stringify(jsonData);
            $.ajax({
                url: '/Customer/SaveAddress',
                type: "POST",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                data: addressData,
                success: function (result) {
                    $("#addIndividualAddressDialog").data("kendoWindow").close();
                },
                error: function (result) {
                    alert("Failed");
                }

            });
        });

控制器标头:

[HttpPost]
 public ActionResult SaveAddress(AddressViewModel addressViewModel)

这是我在萤火虫中看到的:

在此处输入图像描述

这就是我在 VS 中看到的:

在此处输入图像描述

如您所见,普通属性绑定正确,但我的嵌套对象(国家/地区)为空。我阅读了很多不同的文章,但我仍然不知道我做错了什么。请帮帮我!

4

6 回答 6

19

您可以保持现有的 ActionMethod 不变而无需 json 序列化:在客户端从您的 json 创建一个对象:

JSON.parse(jsonData)

并将其发送到 $.ajax 数据属性中。

或者,不是创建 json,而是创建一个对象:

var dataObject = new Object();
dataObject.Town = $('#txt-Town').val();
dataObject.District = $('#txt-District').val();
...

再次,在 $.ajax 数据属性中发送该对象。

于 2014-01-14T14:49:04.427 回答
18

问题出在您的操作方法参数上:

[HttpPost]
public ActionResult SaveAddress(AddressViewModel addressViewModel)

当你使用JSON.stringify()时,你向你的控制器发送一个字符串,而不是一个对象!所以,你需要做一些工作来实现你的目标:

1)更改您的操作方法参数:

[HttpPost]
public ActionResult SaveAddress(string addressViewModel)

2) 将该字符串反序列化为一个对象 - 即 AddressViewModel:

IList<AddressViewModel> modelObj = new 
JavaScriptSerializer().Deserialize<IList<AddressViewModel>>(addressViewModel);

因此,您的最终操作方法应如下所示:

[HttpPost]
public ActionResult SaveAddress(string addressViewModel)
{
    IList<AddressViewModel> modelObj = new 
    JavaScriptSerializer().Deserialize<IList<AddressViewModel>>(addressViewModel);

    // do what you want with your model object ...
}
于 2013-08-22T08:26:46.033 回答
3

实际上最好的选择就是删除

var addressData = JSON.stringify(jsonData);

行并发送 jsonData 本身。如果它是一个实际对象而不仅仅是一个字符串,ASP.NET MVC 将自动绑定它。

奥卡姆剃刀

于 2015-05-07T18:10:03.597 回答
2

很抱歉回答旧线程。在这里你可以使用JsonResult而不是ActionResult

这是你的签名

 [HttpPost]
 public ActionResult SaveAddress(AddressViewModel addressViewModel)

它应该看起来像

[HttpPost]
 public JsonResult SaveAddress(AddressViewModel addressViewModel)
 {
    return Json(status);
 }

好处是如果你使用JsonResult而不是ActionResult你不需要Deserialize

这是链接http://codeforcoffee.org/asp-net-mvc-intro-to-mvc-using-binding-json-objects-to-models/ 从这个链接你可以得到这个想法。

于 2015-06-29T18:38:44.630 回答
1

或者你可以使用JsonConvert.DeserializeObject<>();

以下是反序列化JSON.stringify()结果的代码

IList<AddressViewModel> modelObj = JsonConvert.DeserializeObject<IList<AddressViewModel>>(addressViewModel);

代替

JavaScriptSerializer().Deserialize<IList<AddressViewModel>>(addressViewModel);
于 2014-04-22T09:39:21.490 回答
-2
您必须在 jsonData 变量中引用 Country 对象。JSON POST 绑定将正常工作。

旧代码:

    var jsonData = {
        "镇": $('#txt-Town').val(),
        "区": $('#txt-District').val(),
        "街": $('#txt-Street').val(),
        "邮政编码": $('#txt-PostCode').val(),
        "FlatNumber": $('#txt-FlatNumber').val(),
        "前提名称": $('#txt-前提名称').val(),
        "PremiseNumber": $('#txt-Premisenumber').val(),
        “国家”: {
            "名称": $('#txt-Country').val(),
        }

新代码:
    var jsonData = {
        "镇": $('#txt-Town').val(),
        "区": $('#txt-District').val(),
        "街": $('#txt-Street').val(),
        "邮政编码": $('#txt-PostCode').val(),
        "FlatNumber": $('#txt-FlatNumber').val(),
        "前提名称": $('#txt-前提名称').val(),
        "PremiseNumber": $('#txt-Premisenumber').val(),
        "Country.Name": $('#txt-Country').val(),
        }      


于 2015-11-12T09:24:14.280 回答