简体   繁体   English

如何使用 ASP.NET MVC 和 Knockout JS 将真/假值绑定到复选框

[英]how to bind true/false value to checkbox with ASP.NET MVC and Knockout JS

I'm trying to bind the IsConfirmed field from the ASP.NET webpages_Membership table to a checkbox, using Knockout JS and can't seem to get it working.我正在尝试使用 Knockout JS 将 ASP.NET 网页成员表中的 IsConfirmed 字段绑定到复选框,但似乎无法使其正常工作。

I have it binding to the checkbox, but unless I set it to !$data.IsConfirmed, the checkboxes are not check.我将它绑定到复选框,但除非我将其设置为 !$data.IsConfirmed,否则不会选中复选框。 I have also hooked up a click event to fire an updateUser function in my view-model, it does update it, but doesn't toggle the value sent.我还连接了一个 click 事件以在我的视图模型中触发一个 updateUser 函数,它会更新它,但不会切换发送的值。 It always sends true, when it should send true if the checkbox is checked, otherwise false and then uncheck the checkbox.它总是发送真,如果复选框被选中,它应该发送真,否则为假,然后取消选中复选框。

Here is my markup这是我的标记

<table id="usersTable" class="table table-striped table-bordered table-hover">
    <thead>
        <tr>
            <th>User ID</th>
            <th>Username</th>
            <th>Role</th>
            <th>Date Created</th>            
            <th>Last Failed Login</th>            
            <th>Active</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: users">
        <tr>            
            <td>
                <span data-bind="text: $data.UserId"></span>
            </td>
            <td>
                <span data-bind="text: $data.Username"></span>
            </td>
            <td>
                <span data-bind="text: $data.Role"></span>
            </td>            
            <td>
                <span data-bind="text: $data.DateCreated"></span>
            </td>
            <td>
                <span data-bind="text: $data.LastFailedLogin"></span>
            </td>
            <td>
                <input type="checkbox" data-bind="click: updateUser, checked: $data.IsConfirmed" />
            </td>           
        </tr>
    </tbody>
</table>

And the Javascript和 Javascript

<script type="text/javascript">
    var baseUri = '@ViewBag.ApiUrl';
    var self = this;
    self.users = ko.observableArray();
    // define user view-model
    function UsersViewModel() {               
        // get users to populate the view model        
        $.getJSON(baseUri, self.users);        

        // update the users IsConfirmed status
        self.updateUser = function (user) {            
            $.ajax({ type: "PUT", url: baseUri + '/' + user.UserId, data: user });
        }
        // re-load the users after any modifications
        $.getJSON(baseUri, self.users);        
    };   
    $(document).ready(function () {
        ko.applyBindings(new UsersViewModel());        
    });
</script>

JSON From Server来自服务器的 JSON

[{
    "UserId": 6,
    "Username": "john@jdoe.com",
    "Role": "Guest",
    "DateCreated": "11/12/2012 1:18:41 PM",
    "LastFailedLogin": "",
    "IsConfirmed": false
}, {
    "UserId": 3,
    "Username": "simpleuser",
    "Role": "Administrator",
    "DateCreated": "11/11/2012 6:17:32 PM",
    "LastFailedLogin": "",
    "IsConfirmed": false
}, {
    "UserId": 2,
    "Username": "testUser",
    "Role": "Administrator",
    "DateCreated": "11/11/2012 6:17:32 PM",
    "LastFailedLogin": "",
    "IsConfirmed": false
}, {
    "UserId": 5,
    "Username": "jdoe1@nowhere.com",
    "Role": "Student",
    "DateCreated": "11/12/2012 3:31:38 AM",
    "LastFailedLogin": "",
    "IsConfirmed": false
}, {
    "UserId": 8,
    "Username": "nobody@somewhere.com",
    "Role": "Alumni",
    "DateCreated": "11/12/2012 1:24:15 PM",
    "LastFailedLogin": "",
    "IsConfirmed": false
}, {
    "UserId": 9,
    "Username": "test@test.com",
    "Role": "Applicant",
    "DateCreated": "11/12/2012 1:25:18 PM",
    "LastFailedLogin": "",
    "IsConfirmed": false
}, {
    "UserId": 1,
    "Username": "user1",
    "Role": "Administrator",
    "DateCreated": "11/11/2012 6:17:31 PM",
    "LastFailedLogin": "11/12/2012 4:54:51 PM",
    "IsConfirmed": false
}, {
    "UserId": 4,
    "Username": "test@test.com",
    "Role": "Alumni",
    "DateCreated": "11/11/2012 6:22:23 PM",
    "LastFailedLogin": "11/11/2012 8:23:57 PM",
    "IsConfirmed": false
}, {
    "UserId": 7,
    "Username": "test@test2.com",
    "Role": "Student",
    "DateCreated": "11/12/2012 1:23:56 PM",
    "LastFailedLogin": "",
    "IsConfirmed": false
}]

C# Web API Controller C# Web API 控制器

// GET api/Membership
        public IEnumerable<SiteMemberDTO> GetMemberships()
        {
            var users = db.webpages_Membership.AsEnumerable();
            var profiles = db.UserProfiles.AsEnumerable();            

            // now build our DTO object
            var membersList = new List<SiteMemberDTO>();
            foreach (var profile in profiles)
            {
                var member = new SiteMemberDTO() {
                    UserId = profile.UserId, 
                    Username = profile.UserName,
                    Role = profile.webpages_Roles.SingleOrDefault(r => r.RoleName != "").RoleName,
                    DateCreated = db.webpages_Membership.Find(profile.UserId).CreateDate.ToString(),
                    LastFailedLogin = db.webpages_Membership.Find(profile.UserId).LastPasswordFailureDate.ToString()
                };

                membersList.Add(member);
            }
            return membersList;
        }

DTO (Data-Transfer-Object) DTO(数据传输对象)

 public class SiteMemberDTO
    {
        public int UserId { get; set; }
        public string Username { get; set; }
        public string Role { get; set; }

        public string DateCreated { get; set; }
        public string  LastFailedLogin { get; set; }

        public bool IsConfirmed { get; set; }
    }

This is the complete code for what I'm doing.这是我正在做的事情的完整代码。 For some reason I see in the JSON it's returning false for IsConfirmed , when in the database it's true for every record.出于某种原因,我在 JSON 中看到IsConfirmed返回 false,而在数据库中,每条记录都为 true。

I see you are not assigning the IsConfirmed when you create the DTO object.我看到您在创建 DTO 对象时没有分配 IsConfirmed。 That's why it's always false!这就是为什么它总是假的!

var member = new SiteMemberDTO() {
                UserId = profile.UserId, 
                Username = profile.UserName,
                Role = profile.webpages_Roles.SingleOrDefault(r => r.RoleName != "").RoleName,
                DateCreated = db.webpages_Membership.Find(profile.UserId).CreateDate.ToString(),
                LastFailedLogin = db.webpages_Membership.Find(profile.UserId).LastPasswordFailureDate.ToString(),
                IsConfirmed = profile.IsConfirmed
            };

EDIT:编辑:

it seems there is a problem with checkboxes and click event: Checkboxes are being checked before click handler is even called复选框和单击事件似乎存在问题: 在调用单击处理程序之前检查复选框

so instead of click, use change event:所以不要点击,而是使用更改事件:

data-bind="checked: IsConfirmed, event: { change: $parent.updateUser}"

checkout this fiddle: http://jsfiddle.net/Soroush/89anx/10/结帐这个小提琴: http : //jsfiddle.net/Soroush/89anx/10/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM