【问题标题】:Can`t get json object to with knockout无法通过淘汰赛获得 json 对象
【发布时间】:2013-01-14 23:38:32
【问题描述】:

我无法获取 json 对象。

我的对象是:

public class Person
{
   public string firstName { get; set; }
   public string lastName { get; set; }        
}

人员控制:

    public ActionResult Index()
    {
        return View();
    }

    // GET: /Persons/GetPerson
    //[AcceptVerbs(HttpVerbs.Get)]
    //[OutputCache(Duration = 0, VaryByParam = "*")]
    public JsonResult GetPerson()
    {
        Person p = new Person { firstName = "Jonas", lastName = "Antanaitis" };
        return Json(p, JsonRequestBehavior.AllowGet);
    }

我的索引视图:

@Scripts.Render("~/bundles/knockout")

<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>

<div id="dispJson"></div>
<script type="text/javascript">                
    var data = $.getJSON(".../GetPerson", function (result) {
        //state = result.readyState;
        firstName: result.firsName;
        lastName: result.lastName;
    })    
    .error(function () { alert("error"); });    

    function viewModel() {
        ko.mapping.fromJS(data);
        //state = data.readyState;
        //firstName = data.firstName;
        //lastName = data.lastName;
    };    
    document.write(JSON.stringify(data)); //this line prints  "{"readyState":1}"

    ko.applyBindings(new viewModel());    
</script>

当我在浏览器中转到“.../GetPerson”时,会显示以下内容: {"firstName":"Jonas","lastName":"Antanaitis"}

,但是当尝试在视图中获取 javascript 数据时 - 我没有得到这些数据。

我做错了什么,为什么我无法获取数据? 注释代码的地方 - 我尝试了这种方法..但没有任何帮助。

我试过了:

*$.ajax({
    type: "GET",
    cache: false,
    url: ".../GetPerson",        
}).done(function (msg) {
    alert("Data Saved: " + msg.readyState + "  " + msg.firstName + "  " + msg.lastName);
});*

然后警报框显示:“Data Saved: undefined Jonas Antanaitis

【问题讨论】:

  • 您能否检查浏览器调试器工具中的网络选项卡,以检查您在使用 ajax 调用时尝试访问的 url。 ajax url .../GetPerson 看起来有点不对劲。使用类似于 @Url.Action("GetPerson", "Persons")Url 帮助器生成 url 可能在您的 JSON 或 Ajax 调用中效果更好。
  • 我的原始 URL = "h t t p://localhost:52368/Persons/GetPerson"(我写的很矮,因为我不能发布完整的 url)。在网络中显示两个请求:“h t p://localhost:52368/Persons/GetPerson?_=1359611346968”和“h t p://localhost:52368/Persons/GetPerson”
  • 啊。我知道了。在这种情况下,如果网址相同,则可能与felix 的答案有关。

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


【解决方案1】:

您正在将异步代码与同步代码混合使用...您这里有这一行

var data = $.getJSON(".../GetPerson", function (result) {

data 实际上是一个承诺(这是 ajax 返回的内容)。在回调执行之前,您实际上并没有数据 - 即结果是具有 ACTUAL 数据的东西。

您需要将绑定移动到回调内部或使用事后设置的可观察对象:

1) 回调示例内部

<script type="text/javascript">                
    $.getJSON(".../GetPerson", function (result) {

        function viewModel() {
            return ko.mapping.fromJS(result);
        };

        ko.applyBindings(new viewModel());
    })    
    .error(function () { alert("error"); });        
</script>

2) 使用可观察对象

<script>
    function viewModel() {
        return { data: ko.observable() };
    };

    // Your html bindings will bind to data.* instead of just *
    ko.applyBindings(new viewModel());

    $.getJSON(".../GetPerson", function (result) {
        data(ko.mapping.fromJS(result));
    })    
    .error(function () { alert("error"); });      
</script>

以及对应的html(with绑定比if更简洁):

<!-- ko with: data -->
<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>
<!-- /ko -->

第二种方法的优点是您可以快速绑定所有内容...然后可以在数据进入时显示您的数据。

【讨论】:

  • 当我使用 {2} 方法时,在 IE 中返回错误:SCRIPT5022: Unable to parse bindings。消息:ReferenceError:'firstName'未定义;绑定值:文本:firstName
  • 是的,没错...在 (2) 中,您必须将绑定值更改为:text: data().firstName - 哦,您需要在其周围添加一个 if: data,这样它就不会尝试绑定如果数据为空(最初将是)
  • 也许你可以帮助解决这个问题。 stackoverflow.com/questions/14636135/…
  • 如果怎么写呢?我试过 {data().firsName, data 等等...}
  • @Felix:您能否将 if:data 和 text: data().firstName 添加到您的答案中,以便我们看到它们应该在哪里?
猜你喜欢
  • 2015-06-02
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 2014-09-29
相关资源
最近更新 更多