2

こんにちはみんな私は問題があります.ユーザーには3行あり、各行には5つのチェックボックス(Html.CheckBoxFor)があります.これらのチェックボックスはこれらのユーザーに権限を割り当てるためのものです.私の問題は、行1のチェックボックス2がチェックされていないときです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)正しいidですname

  1. プロパティは、次のようなネストされたモデルからのものです。model.Address.Street
  2. プロパティは、次のような配列またはコレクションです。model.Order[0]

あなたのビューは単純で、上記のシナリオを使用していませんが、jQuery セレクターのために要素に 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 に答える