Asp.net mvc 无法使用knockout将json对象获取到
我无法获取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
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 -->