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

C# 如何使用ASP.NET MVC和Knockout JS将真/假值绑定到复选框,c#,javascript,knockout.js,asp.net-mvc-4,C#,Javascript,Knockout.js,Asp.net Mvc 4,我正在尝试使用敲除JS将ASP.NET webpages_成员表中的IsConfiged字段绑定到复选框,但似乎无法使其正常工作 我将其绑定到复选框,但除非我将其设置为$data.Is已确认,复选框未选中。我还连接了一个click事件,在我的视图模型中启动了updateUser函数,它会更新它,但不会切换发送的值。它总是发送true,如果选中复选框,则应发送true,否则为false,然后取消选中复选框 这是我的标记 <table id="usersTable" class="table

我正在尝试使用敲除JS将ASP.NET webpages_成员表中的IsConfiged字段绑定到复选框,但似乎无法使其正常工作

我将其绑定到复选框,但除非我将其设置为$data.Is已确认,复选框未选中。我还连接了一个click事件,在我的视图模型中启动了updateUser函数,它会更新它,但不会切换发送的值。它总是发送true,如果选中复选框,则应发送true,否则为false,然后取消选中复选框

这是我的标记

<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>
C#Web API控制器

[{
    "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
}]
// 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;
        }

这是我正在做的事情的完整代码。由于某种原因,我在JSON中看到,对于IsConfirmed,它返回false,而在数据库中,对于每个记录,它都是true。

我看到,在创建DTO对象时,您没有分配IsConfirmed。这就是为什么它总是假的

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
            };
编辑:

复选框和单击事件似乎有问题:

因此,不要单击,而是使用更改事件:

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

签出此提琴:

您可以显示更多的标记吗?我猜您一定是在某个时候对用户进行了迭代?用完整的标记对其进行了更新。javascript对象上的
IsConfirmed
属性实际上是布尔值而不是字符串值吗?它是使用ASP.NET的SimpleMembership提供程序创建的webpages\u成员表中的一个位列。在我的DTO(数据传输对象)中,它位于一个布尔字段中,在json中返回true或false?因为你的代码看起来很好…很好的捕捉!谢谢:)修复了返回false的值,但是现在我需要知道为什么当您单击复选框时,它不会取消检查/重新检查,并且它总是在updateUser javascript函数中将值true发送到服务器。它需要根据检查状态更改其值,然后使用该值调用updateUser函数。正在尝试更新状态字段以激活和取消激活用户。谢谢你的帮助。:)
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
            };
data-bind="checked: IsConfirmed, event: { change: $parent.updateUser}"