Asp.net mvc 无法使用knockout将json对象获取到

Asp.net mvc 无法使用knockout将json对象获取到,asp.net-mvc,json,jquery,knockout.js,Asp.net Mvc,Json,Jquery,Knockout.js,我无法获取json对象 我的目标是: public class Person { public string firstName { get; set; } public string lastName { get; set; } } 人员控制: public ActionResult Index() { return View(); } // GET: /Persons/GetPerson //[Accep

我无法获取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>

然后警报框显示:“保存的数据:未定义的Jonas Antanaitis”

您正在将异步代码与同步代码混合使用。。。你有这条线吗

var data = $.getJSON(".../GetPerson", function (result) {
数据
实际上是一个承诺(这是ajax返回的结果)。在回调执行之前,您实际上并不拥有数据——即结果就是拥有实际数据的东西

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

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>

$.getJSON(“…/GetPerson”,函数(结果){
函数viewModel(){
返回ko.mapping.fromJS(结果);
};
应用绑定(新的viewModel());
})    
.error(函数(){alert(“error”);});
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>

函数viewModel(){
返回{data:ko.observable()};
};
//您的html绑定将绑定到数据。*而不仅仅是*
应用绑定(新的viewModel());
$.getJSON(“…/GetPerson”,函数(结果){
数据(ko.mapping.fromJS(结果));
})    
.error(函数(){alert(“error”);});
以及相应的html(使用绑定使其比if更干净):


名字:

姓氏:


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

您是否可以检查浏览器调试器工具中的“网络”选项卡,以检查在使用ajax调用时它试图访问的url。ajax url
../GetPerson
看起来有点不对劲。使用类似于:
@Url.Action(“GetPerson”、“Persons”)
Url帮助程序生成Url在JSON或Ajax调用中可能会更好。我的原始Url=“h t t p://localhost:52368/Persons/GetPerson”(我写得很短,因为我无法发布完整的Url)。在网络中显示了两个请求:“htp://localhost:52368/Persons/GetPerson?”\u1359611346968”和“htp://localhost:52368/Persons/GetPerson”啊。我懂了。在这种情况下,如果URL相同,则可能与felix的答案有关。消息:ReferenceError:“firstName”未定义;绑定值:text:firstname是的,没错。。。在(2)中,您必须将bindings值更改为:
text:data().firstName
-oh,并且您需要在其周围设置一个
if:data
,以便在数据为null时(最初为null)它不会尝试绑定。也许您可以帮助解决这个问题。如何写如果?我尝试了{data().firsName,data等等…}@Felix:你能把if:data和text:data().firstName添加到你的答案中吗?
<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>
<!-- ko with: data -->
<p>First name: <strong data-bind="text: firstName"></strong></p>
<p>Last name: <strong data-bind="text: lastName"></strong></p>
<!-- /ko -->