2

嗨,伙计们,我有一个问题,我有 3 行用户,每行有 5 个复选框(Html.CheckBoxFor)这些复选框用于为这些用户分配权限。我的问题是当未选中第 1 行的 CheckBox 2 时 CheckBox 1 for row 1 也应该取消选中。但这并没有发生,而不是只取消选中第 1 行,而是取消选中复选框 1 的整个列。这是我的 Jquery 函数。

function setRights() {
var personalReport = document.getElementById("personalReports");
alert(personalReport.value);
personalReport.addEventListener('change', function () {
    if (personalReport.value) {
        $($("form #viewAllReports").attr('checked', false));
    }
    else {
    }
});
} 

“personalReports”和#viewAllReports“是我给我的 Html.CheckboxFor(s) 的 ID。这确实有效,但也不是我想要的方式,我想我在这里要求的是,一种唯一识别所有这些的方法以我可以在 jquery 中指定它的方式行,以获得所需的结果,这将影响我正在忙的行。提前致谢。

这是我的视图代码:

    <div class="chkbox">                            
        @Html.CheckBoxFor(m => m.PersonalReports, new { id = "personalReports", onclick   = "setRights();" })
    </div>
    <div class="chkbox">                            
        @Html.CheckBoxFor(m => m.ViewAllReports, new { id = "viewAllReports"})
    </div>
    <div class="chkbox">                            
        @Html.CheckBoxFor(m => m.EditAI)
    </div>
    <div class="chkbox">                            
        @Html.CheckBoxFor(m => m.ReportBranding)
    </div>
    <div class="chkbox">                            
        @Html.CheckBoxFor(m => m.PersonalizeTheme)
    </div>
    <div class="chkbox">
    @Html.CheckBoxFor(m => m.Search)
    </div>
    <div class="chkbox">
    @Html.CheckBoxFor(m => m.RequestOutOfBundleSearch)
    </div>
4

2 回答 2

3

当我们使用Html.xxxxxxFor(m => m.property)时,总是有一个问题:jQuery 选择器是如何获取该元素的?

@[gdoron] 说的是部分正确的:使用和等于属性名称Html.xxxxxxFor(m => m.property)构建一个 HTML 元素,除非:idname

  1. 属性来自嵌套模型,例如:model.Address.Street
  2. 属性是一个数组或集合,例如:model.Order[0]

尽管您的视图很简单并且没有使用上述任何场景,但为了 jQuery Selector,我仍然更喜欢向元素添加 HTML 属性。

以下代码非常适合我:

@Html.CheckBoxFor(m => m.BoolValue1, new { value = "check-box-1" }) Check Box 1 (drives check box 2)
<br />
@Html.CheckBoxFor(m => m.BoolValue1, new { value = "check-box-2" }) Check Box 2


<script type="text/javascript">
    $(function () {
        $('input[value="check-box-1"]').bind('change', function () {
            personalReports_changed();
        });
    });

    function personalReports_changed() {
        if ($('input[value="check-box-1"]').attr('checked'))
            $('input[value="check-box-2"]').attr('checked', true);
        else
            $('input[value="check-box-2"]').removeAttr('checked');
    }
</script>
于 2012-06-26T02:31:25.510 回答
1

尽管我已经回答了这个问题,但我想提出一个相对更复杂的场景,并展示我们如何使用 jQuery 管理复选框以相互影响。

设想

  1. 想象一下,我们有一个书籍列表(来自数据库或任何其他存储库)
  2. 用户可以说:“我喜欢这本书。”
  3. 用户可以说:“我喜欢这本书。”

规则:

  1. 如果用户喜欢一本书,这意味着他/她也喜欢它。
  2. 如果用户不喜欢一本书,他/她也不会喜欢它。

代码

楷模:

namespace MvcApplication1.Models
{
    public class Book
    {
        public string Title { get; set; }
        public bool IsLikeIt { get; set; }
        public bool IsLoveit { get; set; }
    }

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

视图模型:

namespace MvcApplication1.ViewModels
{
    public class BookViewModel
    {
        public Models.Person User { get; set; }
        public List<Models.Book> Books { get; set; }
        public BookViewModel()
        {
            Books = new List<Models.Book>();
        }
    }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        BookViewModel viewModel = new BookViewModel();

        viewModel.User = new Models.Person() 
                   { FirstName = "John", LastName = "Smith" };
        viewModel.Books.Add(new Models.Book() 
                   { Title = "Beginning ASP.NET 4: in C# and VB" });
        viewModel.Books.Add(new Models.Book() 
                   { Title = "Professional ASP.NET 4 in C# and VB" });
        viewModel.Books.Add(new Models.Book() 
                   { Title = "Pro ASP.NET MVC 3 Framework" });
        viewModel.Books.Add(new Models.Book() 
                   { Title = "Microsoft ASP.NET CODING STRATEGIES-W/ ASP .NET TEAM" });
        viewModel.Books.Add(new Models.Book() 
                   { Title = "Pro ASP.NET 4 in C# 2010, Fourth Edition" });

        return View(viewModel);
    }

    [HttpPost]
    public ActionResult Index(BookViewModel viewModel)
    {
        //save data.
        return View(viewModel);
    }

}

查看(\Home\Index.cshtml):

@using MvcApplication1.Models
@model MvcApplication1.ViewModels.BookViewModel
<div>
    <p>
        User name: @Html.DisplayFor(u => u.User.FirstName)
        @Html.DisplayFor(u => u.User.LastName)</p>
</div>
<div>
    @using (Html.BeginForm())
    {
        @Html.HiddenFor(u => u.User.FirstName)
        @Html.HiddenFor(u => u.User.LastName)

        <table border="1">
            <thead>
                <tr>
                    <th>
                        I like it
                    </th>
                    <th>
                        I Love it
                    </th>
                    <th>
                        Book title
                    </th>
                </tr>
            </thead>
            <tbody>
                @for (int index = 0; index < Model.Books.Count; index++)
                {
                    <tr>
                        <td>@Html.CheckBoxFor(b => b.Books[index].IsLikeIt, new { id = string.Format("like-it-{0}", index), data_index = index })
                        </td>
                        <td>@Html.CheckBoxFor(b => b.Books[index].IsLoveit, new { id = string.Format("love-it-{0}", index), data_index = index })
                        </td>
                        <td>@Html.DisplayFor(b => b.Books[index].Title)
                            @Html.HiddenFor(b => b.Books[index].Title)
                        </td>
                    </tr>
                }
            </tbody>
        </table>
        <input type="submit" value="Submit" />
    }
</div>
<script type="text/javascript">

    $(function () {
        $('input[id^="like-it-"]').change(function (e) { likeit_clicked(e); });
        $('input[id^="love-it-"]').change(function (e) { loveit_clicked(e); });
    });

    function likeit_clicked(event) {
        if (!event.target.checked) {
            var index = $(event.target).attr('data-index');
            var loveitid = '#love-it-' + index;
            $(loveitid).attr('checked', false);
        }
    }

    function loveit_clicked(event) {
        if (event.target.checked) {
            var index = $(event.target).attr('data-index');
            var likeitid = '#like-it-' + index;
            $(likeitid).attr('checked', true);
        }
    }

</script>

视图可能看起来很糟糕。您可以根据自己的需求开发更好的视图。

顺便说一句,在 MVC 视图引擎生成的渲染 html 中,您可以看到复选框的长名称:

name="Books[0].IsLikeIt"
name="Books[1].IsLikeIt"
name="Books[2].IsLikeIt"
.
.
.

但是通过生成我们自己的 id ( id = string.Format("like-it-{0}", index)) 和定义data-index属性,jQuery 能够以适当的方式选择和更改此复选框。

另请阅读:HTML5 自定义数据属性 (data-*)

于 2012-06-27T22:50:44.487 回答