【问题标题】:Post knockout observable array as object property asp.net mvc将淘汰后可观察数组作为对象属性 asp.net mvc
【发布时间】:2013-03-06 00:11:52
【问题描述】:

我正在尝试将 ko.observable 数组作为对象的一部分发布,所有数据都可以到达服务器,但数组不为空但计数为零。

这是在客户端

    function submitAsync() {
    var viewModel = constructModel();

    setTimeout(function () {
        $.ajax({
            url: '/Article/Index',
            type: 'POST',
            data: JSON.stringify({ viewModel: viewModel }),
            contentType: 'application/json; charset=utf-8',
        })
    },2000);
    console.log(viewModel);
}

function constructModel(){
    var articleViewModel = {};
    articleViewModel.Authors = ko.toJSON(appViewModel.authors);

    articleViewModel.ArticleData = {};
    articleViewModel.ArticleData.Title = $("#ArticleData_Title").text();
    articleViewModel.ArticleData.CorespondingAuthor = $("#ArticleData_CorespondingAuthor").text();
    articleViewModel.ArticleData.Keywords = $("#ArticleData_Keywords").text();

    articleViewModel.ArticleContent = {};
    articleViewModel.ArticleContent.Abstract = $("#ArticleContent_Abstract").text();
    articleViewModel.ArticleContent.FullText = ArticleContent();

    return articleViewModel;
}

我的视图模型

public class ArticleViewModel
{
    public ArticleData ArticleData { get; set; }
    public ArticleContent ArticleContent { get; set; }
    public ICollection<Author> Authors { get; set; }
}

我的控制器操作 viewModel.Authors 不为空,但计数为 0

[HttpPost]
        public ActionResult Index(ArticleViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                mergeViewModelToCurrentArticle(viewModel);
                _documentPath = GenerateDocument(_currentArticle);
                return RedirectToAction("Success");
            }
            return View();
        }

javascript输出的ko数组

Authors: "[{"id":1,"firstName":"User first name","lastName":"user last name","email":"user@gmail.com","phone":"xxxxx","address":"Dunarii Nr.3","fullName":"user full name"}]"

【问题讨论】:

  • Author 在 C# 中的表现如何?您也可以尝试使用数据:JSON.stringify(viewModel),
  • 属性名称的大小写应该匹配。在 JS 中你有 firstName 但在 C# 中 FirstName...
  • 没有 JSON.stringify 我得到无效的 JSON 原语:作者。
  • 我已经更新了,我发布的数据看起来像Authors: "[{"Id":1,"FirstName":"First Name","LastName":"LastName","Email":"email@gmail.com","Phone":"0751000000","Address":"Dunarii Nr.3","fullName":"First Name LastName"}]"

标签: jquery asp.net ajax asp.net-mvc knockout.js


【解决方案1】:

简单替换

articleViewModel.Authors = ko.toJSON(appViewModel.authors);

与:

articleViewModel.Authors = appViewModel.authors;

您对 Authors 数组进行双重 JSON 编码,这是不必要的。

【讨论】:

  • 考虑过,并且已经尝试过了,但是如果我这样做,作者现在变为空,而不是计数为 0
  • 尝试从您的 Author 模型中删除 implicit operator
  • 这也不起作用,当我只发布作者时,即使使用隐式运算符也可以使用
  • 这很奇怪。您能否显示在 AJAX 请求期间发送到服务器的确切 JSON?我怀疑您的模型和 JSON 字符串之间可能存在一些差异。
  • 真的不这么认为,因为正如我所说的那样,当我刚刚发布作者时,它就起作用了,但我真的很陌生。这是 JSON
【解决方案2】:

感谢达林,我设法弄清楚解决方案显然是替换

articleViewModel.Authors = ko.toJSON(appViewModel.authors); 

articleViewModel.Authors = $.parseJSON(ko.toJSON(appViewModel.authors))

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 2013-05-30
    • 2013-08-11
    • 2012-09-08
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多