【问题标题】:Why are certain class instantiations apparently not being converted properly to json?为什么某些类实例化显然没有正确转换为 json?
【发布时间】:2013-09-24 19:21:51
【问题描述】:

我通过在 razor/cshtml 文件上调用 getJSON 来生成页面上 div 的内容。 90% 的代码有效 - 从 2013 年到 1960 年 - 正如您在 http://www.awardwinnersonly.com/ 中看到的那样,通过从书籍下拉列表中选择“Hugos(科幻小说)”,但在我添加的最后几个“记录”中(从 1959 年到1946) 显然导致对 getJSON('getHugos.cshtml') 的调用失败,因为页面根本不显示这些附加记录。

(问题“记录”暂时注释掉)

注意:带有“blankThis”和“blankThat”等时髦变量的“记录”以及将类别设置为一年的“记录”都不是问题;它们只是相当笨拙-如果类别的长度为四个字符,则“记录”是一年,并且处理方式不同。

此外,以“--”作为其值的元素不是问题 - 在这些情况下,不会创建相应的按钮(对于 Kindle、Hardcopy 或平装版)。

这里是 cshtml 文件中的代码子集。省略号表示许多省略的“记录”;其中大部分,显然是问题所在,在第二组省略号和注释之后:

@{
    var books = new List<BookClass>
    {
        new BookClass{Year=2013, YearDisplay="blankYearDisplay", Category="2013", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",   
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
. . .
new BookClass{Year=2001, YearDisplay="2001", Category="Best Novella", Title="The Ultimate Earth", Author="Jack Williamson", KindleASIN="B00DV8TSHO", HardboundASIN="--", PaperbackASIN="1612421547",   
ImgSrc="http:images.amazon.com/images/P/B00DV8TSHO.01.MZZZZZZZ"}
. . . 
// the above works, from 2013 down to 1960, but something in the last few "records" is apparently causing it to fail
        new BookClass{Year=1959, YearDisplay="blankYearDisplay", Category="1959", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1959, YearDisplay="1959", Category="Best Novel", Title="A Case of Conscience", Author="James Blish", KindleASIN="--", HardboundASIN="B000J52BAI", PaperbackASIN="0345438353",     
ImgSrc="http:images.amazon.com/images/P/0345438353.01.MZZZZZZZ"},
        new BookClass{Year=1958, YearDisplay="blankYearDisplay", Category="1958", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",     
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1958, YearDisplay="1958", Category="Best Novel", Title="The Big Time", Author="Fritz Leiber", KindleASIN="B004UJHII4", HardboundASIN="0899685374", PaperbackASIN="B003YMNGGG",     
ImgSrc="http:images.amazon.com/images/P/B004UJHII4.01.MZZZZZZZ"},
        new BookClass{Year=1956, YearDisplay="blankYearDisplay", Category="1956", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",     
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1956, YearDisplay="1956", Category="Best Novel", Title="Double Star", Author="Robert A. Heinlein", KindleASIN="B0050OVMWG", HardboundASIN="0839824467", PaperbackASIN="0345330137",     
ImgSrc="http:images.amazon.com/images/P/B0050OVMWG.01.MZZZZZZZ"},
        new BookClass{Year=1955, YearDisplay="blankYearDisplay", Category="1955", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",     
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1955, YearDisplay="1955", Category="Best Novel", Title="They'd Rather Be Right (also known as The Forever Machine)", Author="Mark Clifton and Frank Riley", KindleASIN="--", HardboundASIN="--",     
PaperbackASIN="0881848425", ImgSrc="http:images.amazon.com/images/P/0881848425.01.MZZZZZZZ"},
        new BookClass{Year=1954, YearDisplay="blankYearDisplay", Category="1954", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",     
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1954, YearDisplay="1954", Category="Best Novella", Title="A Case of Conscience", Author="James Blish", KindleASIN="--", HardboundASIN="B000M0BM5A", PaperbackASIN="B005KEM8TW",     
ImgSrc="http:images.amazon.com/images/P/B005KEM8TW.01.MZZZZZZZ"},
        new BookClass{Year=1953, YearDisplay="blankYearDisplay", Category="1953", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",     
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1953, YearDisplay="1953", Category="Best Novel", Title="The Demolished Man", Author="Alfred Bester", KindleASIN="B00D2ITJLS", HardboundASIN="B000UF0KTQ", PaperbackASIN="0679767819",     
ImgSrc="http:images.amazon.com/images/P/B00D2ITJLS.01.MZZZZZZZ"},
        new BookClass{Year=1951, YearDisplay="blankYearDisplay", Category="1951", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",     
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1951, YearDisplay="1951", Category="Best Novella", Title="The Man Who Sold the Moon", Author="Robert A. Heinlein", KindleASIN="B00ELJZZ24", HardboundASIN="--", PaperbackASIN="1451639228",     
ImgSrc="http:images.amazon.com/images/P/B00ELJZZ24.01.MZZZZZZZ"},
        new BookClass{Year=1946, YearDisplay="blankYearDisplay", Category="1946", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN",     
PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
        new BookClass{Year=1946, YearDisplay="1946", Category="Best Novella", Title="Animal Farm", Author="George Orwell", KindleASIN="B003ZX868W", HardboundASIN="0151010269", PaperbackASIN="184046254X",     
ImgSrc="http:images.amazon.com/images/P/B003ZX868W.01.MZZZZZZZ"}
    };
    Response.ContentType = "application/json";
    Json.Write(books, Response.Output);
}

“他们宁愿是正确的(也称为永远的机器)”之类的字符串肯定不是问题,不是吗?显然,它编译并运行...

如果可能,我会尝试单步执行 getHugos.cshtml;另外,在浏览器控制台中查看是否有任何错误消息,但是是否有人知道与 cshtml 文件相关的 getJSON 的变幻莫测,这可能有助于解决这个难题?

更新

以这种方式重新排列和重新格式化:

var books = new List<BookClass> {
    new BookClass{Year=1959, YearDisplay="blankYearDisplay", Category="1959", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
    new BookClass{Year=1958, YearDisplay="blankYearDisplay", Category="1958", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
    new BookClass{Year=1956, YearDisplay="blankYearDisplay", Category="1956", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
    new BookClass{Year=1955, YearDisplay="blankYearDisplay", Category="1955", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
    new BookClass{Year=1954, YearDisplay="blankYearDisplay", Category="1954", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
    new BookClass{Year=1953, YearDisplay="blankYearDisplay", Category="1953", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
    new BookClass{Year=1951, YearDisplay="blankYearDisplay", Category="1951", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
    new BookClass{Year=1946, YearDisplay="blankYearDisplay", Category="1946", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},

    new BookClass{Year=1959, YearDisplay="1959", Category="Best Novel",   Title="A Case of Conscience",                                       Author="James Blish",                  KindleASIN="--",         HardboundASIN="B000J52BAI", PaperbackASIN="0345438353", ImgSrc="http:images.amazon.com/images/P/0345438353.01.MZZZZZZZ"},
    new BookClass{Year=1958, YearDisplay="1958", Category="Best Novel",   Title="The Big Time",                                               Author="Fritz Leiber",                 KindleASIN="B004UJHII4", HardboundASIN="0899685374", PaperbackASIN="B003YMNGGG", ImgSrc="http:images.amazon.com/images/P/B004UJHII4.01.MZZZZZZZ"},
    new BookClass{Year=1956, YearDisplay="1956", Category="Best Novel",   Title="Double Star",                                                Author="Robert A. Heinlein",           KindleASIN="B0050OVMWG", HardboundASIN="0839824467", PaperbackASIN="0345330137", ImgSrc="http:images.amazon.com/images/P/B0050OVMWG.01.MZZZZZZZ"},
    new BookClass{Year=1955, YearDisplay="1955", Category="Best Novel",   Title="They'd Rather Be Right (also known as The Forever Machine)", Author="Mark Clifton and Frank Riley", KindleASIN="--",         HardboundASIN="--",         PaperbackASIN="0881848425", ImgSrc="http:images.amazon.com/images/P/0881848425.01.MZZZZZZZ"},
    new BookClass{Year=1954, YearDisplay="1954", Category="Best Novella", Title="A Case of Conscience",                                       Author="James Blish",                  KindleASIN="--",         HardboundASIN="B000M0BM5A", PaperbackASIN="B005KEM8TW", ImgSrc="http:images.amazon.com/images/P/B005KEM8TW.01.MZZZZZZZ"},
    new BookClass{Year=1953, YearDisplay="1953", Category="Best Novel",   Title="The Demolished Man",                                         Author="Alfred Bester",                KindleASIN="B00D2ITJLS", HardboundASIN="B000UF0KTQ", PaperbackASIN="0679767819", ImgSrc="http:images.amazon.com/images/P/B00D2ITJLS.01.MZZZZZZZ"},
    new BookClass{Year=1951, YearDisplay="1951", Category="Best Novella", Title="The Man Who Sold the Moon",                                  Author="Robert A. Heinlein",           KindleASIN="B00ELJZZ24", HardboundASIN="--",         PaperbackASIN="1451639228", ImgSrc="http:images.amazon.com/images/P/B00ELJZZ24.01.MZZZZZZZ"},
    new BookClass{Year=1946, YearDisplay="1946", Category="Best Novella", Title="Animal Farm",                                                Author="George Orwell",                KindleASIN="B003ZX868W", HardboundASIN="0151010269", PaperbackASIN="184046254X", ImgSrc="http:images.amazon.com/images/P/B003ZX868W.01.MZZZZZZZ"}
};

...表示数据没有问题,除非以下内容确实有问题:

Title="他们宁愿做对(也称为永远的机器)"

更新 2

不知何故,这最终出现在我的 getHugos.cshtml 文件的顶部 - 击败了我 - :

/P/

...所以第一行是:

/P/@{

...这就是它失败的原因。

它甚至可以编译对我来说很奇怪和/或令人毛骨悚然 - 事实上,如果它不编译就好了,并指出那条线!

但感谢您对不匹配的 alt 标签的提示,JayC - 它并没有导致 html 失败,但我确定它弄乱了我的 alt。

【问题讨论】:

  • 我认为你解决问题的方法是错误的;你怎么知道你有这个问题?您如何使用 JSON 来呈现内容?另外,它究竟是如何包含在.cshtml 文件中的?是脚本标签的输出部分还是什么?
  • 我知道我遇到了问题,因为内容不再显示。它适用于所有其他人;事实上,它现在可以在实时站点上运行,因为问题代码(上面)已被注释掉。在这两种情况下,我都通过 jQuery 调用 getJSON() 来使用 JSON。在早期的情况下,它是 getJSON('Bla.json')。在这种情况下,它是 getJSON('getHugos.cshtml');该 Razor 文件,如上面原始帖子中所示,然后将这些类转换为 JSON 并返回它们。
  • "...内容不再显示。"我可以用几种方式来解释。带有.getJSON 的请求是否似乎成功,但没有新内容呈现到浏览器中?请求是否成功,并呈现新内容,但是当它似乎遇到有问题的条目时,它会停止吗?无论请求什么,是否某些失败似乎会破坏所有未来的请求?相关问题:您是否使用模板系统或一些自定义的东西从浏览器的 JSON 中呈现 html?您在浏览器的控制台中看到了哪些错误?
  • 我的意思是,您需要查看您的问题是否真的是 JSON 问题或渲染问题(或两者兼而有之)。从你所展示的,我无法判断。 (我可能应该提到的第二点是,在没有控制器的情况下调用 razor 模板有点奇怪,当然也不是生成 JSON 的正常做法;我很惊讶它甚至可以正常工作。更常见的用法是控制器返回 JSONResult 或类似的东西;你甚至不需要剃刀视图。)
  • MVC 对于这个网站来说太过分了,IMO。毕竟,逻辑很简单:用户选择他们想看的奖项,然后加载相关内容。如果他们单击该呈现内容中的按钮,则会加载另一个外部(亚马逊)页面。没什么太花哨的。我从 Mike Brind 的书中得到了如何做到这一点的示例(C#/Razor > JSON)——他的 Web Matrix 书的第 168-172 页左右。因此,我认为如果它没有起作用,那将是令人惊讶的。说实话,当某件事第一次奏效时,我通常会有点惊讶,而当某件事不起作用时,我并不感到惊讶,而是放弃

标签: jquery asp.net json html razor


【解决方案1】:

好的,现在很清楚了。我不确定你从哪里得到这个 htmlBuilder 位,但我很清楚,如果不是你的问题,这就是一个问题。让我们看看你的 Hugos html 生成器:

$.getJSON('GetHugos', function (data) {
    $.each(data, function (i, dataPoint) {
        if (IsClassYear(dataPoint.Category)) {
            htmlBuilder += '<div class=\"yearBanner\">' + dataPoint.Category + '</div>';
        } else {
            htmlBuilder += '<section class=\"wrapper\" ><a id=\"mainImage\" class=\"floatLeft\" href=\"' +
                Urlify(dataPoint.KindleASIN) + '\"' +
                ' target=\"_blank\"><img height=\"160\" width=\"107\" src=\"' +
                dataPoint.ImgSrc + '\ alt=\"' + dataPoint.Title + ' by ' + dataPoint.Author + ' book cover\ ></img></a>' +
                '<div id=\"prizeCategory\" class=\"categorySmallerFont\">' +
                dataPoint.Category +
                '</div><br/><cite id=\"prizeTitle\" >' +
                dataPoint.Title +
                '</cite><br/><div id=\"prizeArtist\" class=\"author\">' +
                dataPoint.Author +
                '</div><br/>';
            if (dataPoint.KindleASIN.trim().length > 2) {
                htmlBuilder += '<button><a href=\"' + Urlify(dataPoint.KindleASIN) + '\"' +
                    ' target=\"_blank\">Kindle</a></button>';
            }
            if (dataPoint.PaperbackASIN.trim().length > 2) {
                htmlBuilder += '<button><a href=\"' + Urlify(dataPoint.PaperbackASIN) + '\"' +
                    ' target=\"_blank\">Paperback</a></button>';
            }
            if (dataPoint.HardboundASIN.trim().length > 2) {
                htmlBuilder += '<button><a href=\"' + Urlify(dataPoint.HardboundASIN) + '\"' +
                    ' target=\"_blank\">Hardcover</a></button>';
            }
            htmlBuilder += '</section>';
        }//else
    }); //each

即使我们假设所有字段都经过正确的 html 编码(通常,您不会假设),这也不会产生有效的 html。

线条

                ' target=\"_blank\"><img height=\"160\" width=\"107\" src=\"' +
                dataPoint.ImgSrc + '\ alt=\"' + dataPoint.Title + ' by ' + dataPoint.Author + ' book cover\ ></img></a>' +  

图像属性srcalt 似乎缺少引号。另外,img 不能有任何子节点,所以只需将其设为单个标签 &lt;img /&gt;,虽然严格来说,这不会给您带来任何问题。

                ' target=\"_blank\"><img height=\"160\" width=\"107\" src=\"' +
                dataPoint.ImgSrc + '\" alt=\"' + dataPoint.Title + ' by ' + dataPoint.Author + ' book cover\" /></a>' +  

通常,我通过使用某种客户端模板解决方案来避免这种情况,就像您可能会在 underscore.js 中找到的那样,或者像小胡子、车把、knockout.js 或 Telerik 的剑道网格这样更花哨的东西。

【讨论】:

  • 我明白你关于缺少“引号结束标记”的意思,但是这段代码可以工作(除非它的一部分被复制错误)......?
【解决方案2】:

您在“终极地球”的结尾 } 后缺少一个逗号。

【讨论】:

  • 我回家后会捷克把它拿出来,但我认为我只是在复制和粘贴代码 - 毕竟它一直工作到 1960 年。直到我添加了最终条目,从 1959 年到 1946 年,问题发生了。
猜你喜欢
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多