【问题标题】:Get database record using AJAX, Knockout and JSON使用 AJAX、Knockout 和 JSON 获取数据库记录
【发布时间】:2014-08-11 03:50:58
【问题描述】:

我对 Knockout 和 Entity Framework 还很陌生,我遇到了一个问题,我似乎无法通过使用 Knockout 的 AJAX 调用从 MVC 4 控制器操作将任何 JSON 输出到 html 页面上。

该表包括字段 Email 和 RegsitrationNumber,这些字段用于验证用户。

如果用户存在于表格中,则他们的国家/地区将显示在屏幕上。

分析器声明状态代码为 200,即 OK。有人可以帮忙吗?

HTML ------

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>

    <script src="./Scripts/jquery-1.8.2.min.js"></script>

</head>
<body>

    <div>
        <div>
            <h2 id="title">Login</h2>
        </div>

        <div>
            <label for="email">Email</label>
            <input data-bind="value: $root.Email" type="text" title="Email" />
        </div>
        <div>
            <label for="registrationnumber">Registration Number</label>
            <input data-bind="value: $root.RegistrationNumber" type="text" title="RegistrationNumber" />
        </div>
        <div>
            <button data-bind="click: $root.login">Login</button>
        </div>
    </div>

    <table id="products1" data-bind="visible: User().length > 0">
        <thead>
            <tr>
                <th>Country</th>
            </tr>
        </thead>
        <tbody data-bind="foreach: Users">
            <tr>
                <td data-bind="text: Country"></td>
            </tr>
        </tbody>

    </table>


    <script src="./Scripts/knockout-2.2.0.js"></script>
    <script src="./Scripts/knockout-2.2.0.debug.js"></script>
    <script src="./Scripts/functions.js"></script>
</body>
</html>

JAVASCRIPT -----

function UserViewModel() {

    //Make the self as 'this' reference
    var self = this;
    //Declare observable which will be bind with UI
    self.Name = ko.observable("Robbie");
    self.Email = ko.observable("rob@test.com");
    self.Occupation = ko.observable("Designer");
    self.Country = ko.observable("UK");
    self.RegistrationNumber = ko.observable("R009");
    self.UserDate = ko.observable("06-04-2014");

    var User = {
        Name: self.Name,
        Email: self.Email,
        Occupation: self.Occupation,
        Country: self.Country,
        RegistrationNumber: self.RegistrationNumber,
        UserDate: self.UserDate
    };

    self.User = ko.observable();  //user
    self.Users = ko.observableArray(); // list of users

    //Login
    self.login = function ()
    {
        alert("login");

        if (User.Email() != "" && User.RegistrationNumber() != "") {


            $.ajax({
                url: '/Admin/Login',
                cache: false,
                type: 'GET',
                contentType: 'application/json; charset=utf-8',
                data: ko.toJSON(User),
                success: function (data) {
                    self.Users.push(data);
                    $('#title').html(data.Email);
                }
            }).fail(
                function (xhr, textStatus, err) {
                    console.log('fail');
                    console.log(xhr.statusText);
                    console.log(textStatus);
                    console.log(err);
                });

        } else {
            alert('Please enter an email and registration number');
        }

    };


}
var viewModel = new UserViewModel();
ko.applyBindings(viewModel);

动作-----

   public ActionResult Login(string Email, string RegistrationNumber)
        {

            var user = from s in db.Users
                              select s;

            user = user.Where(s => s.Email.ToUpper().Equals(Email.ToUpper())
                                                 && s.RegistrationNumber.ToUpper().Equals(RegistrationNumber.ToUpper())
                                                 );

            if (user == null)
            {
               return HttpNotFound(); 
            }
            return Json(user, JsonRequestBehavior.AllowGet);
        }

【问题讨论】:

  • 你能追踪Fiddler中的请求并发布结果吗?
  • 未捕获的错误:无法解析绑定。消息:TypeError:无法读取未定义的属性“长度”;绑定值:可见:User().length > 0 ko.utils.extend.parseBindingsString ko.utils.extend.getBindings ko.dependentObservable.disposeWhenNodeIsRemoved evaluateImmediate ko.dependentObservable applyBindingsToNodeInternal applyBindingsToNodeAndDescendantsInternal applyBindingsToNodeAndDescendantsInternal applyBindingsToNodeAndDescendantsInternal ko.applyBindings (anonym

标签: ajax json entity-framework asp.net-mvc-4 knockout.js


【解决方案1】:

看起来你的绑定不正确...

<table id="products1" data-bind="visible: Users().length > 0">
    <thead>
        <tr>
            <th>Country</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: Users">
        <tr>
            <td data-bind="text: Country"></td>
        </tr>
    </tbody>
</table>

User().length 应该是Users().length

【讨论】:

  • 感谢 Dean 删除了该错误,但现在我得到了 - 未捕获的错误:无法解析绑定。消息:ReferenceError:未定义国家;绑定值:文本:国家
  • 您能否在浏览器中检查网络请求(在 Chrome/FF 中按 F12,那里应该有一个网络选项卡)并验证响应是否具有 Country 属性?
  • 啊,忽略这个。看起来您的 MVC 方法正在返回一组东西。将您的 .Where 改为 .FirstOrDefault
  • 这不起作用,因为我仍然收到未定义的错误 - 用户用户 =(来自 db.Users 中的 u.Email.Equals(Email) && u.RegistrationNumber.Equals(RegistrationNumber) 选择 u) .FirstOrDefault();
  • 我认为这是一个淘汰赛绑定问题,但看不到哪里
猜你喜欢
  • 2021-06-25
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多