1

私はあることに頭を悩ませています (以前に尋ねられたようなことは知っていますが、まったく同じではないことは確かです)。要点: Telerik グリッドを使用したビューがあります。そのグリッドでは、ビューに渡すモデルからいくつかのものを表示しますが、最後の列に、コントローラーのいくつかのものに基づいてチェック/チェックされていないチェックボックスを配置したい(チェックはモデルとは関係ありません渡されています)。ビューを処理する ActionResult 関数では、いくつかのBoolean値を ViewData に保存し、ViewData に保存されている値に基づいて CheckBox に isChecked 値を設定します。

ActionResult のコードは次のとおりです。

    [SecureThis(Roles = "User")]
    public ActionResult Index()
    {
        //get bucket ids
        var buckets = db.Buckets.ToList();
        int i=1;
        string cb = "checkbox" + i.ToString();
        foreach (Bucket b in buckets)
        {
            var payByInvoice = db.PaymentOptions.Where(p => p.BucketId == b.Id).Select(p => p.CanPayByInvoice).SingleOrDefault();
            if (payByInvoice == (int)PayByInvoiceState.Accepted)
                ViewData["checkbox" + i.ToString()] = true;
            else ViewData["checkbox" + i.ToString()] = false;
                i++;
                cb = "checkbox" + i.ToString();
        }
        return View(db.Buckets);
    }

そして、すべてのものを表示するグリッドは次のとおりです。

@{
int i=1;
string cb = "checkbox" + i.ToString();
 }
@(Html.Telerik().Grid(Model)
        .Name("BucketsGrid")
        .DataKeys(keys => keys.Add(bucket => bucket.Id))
        .Columns(
            columns =>
            {
                columns.Template(model => ViewData[model.Id.ToString()])
                    .HeaderTemplate(
                    @<b>@Strings.Title_Customer</b>
                    );
                columns.Bound(model => model.CreditFacility);
                columns.Bound(model => model.Minimum);
                columns.Bound(model => model.RefillLevel);
                columns.Bound(model => model.NotificationEmail);
                columns.Bound(model => model.NotificationSms);
                columns.Template(model => Html.ActionLink(Strings.Edit, "Edit", new { id = model.Id }));
                columns.Template(model => Html.ActionLink(Strings.NotificationOptions, "Bucket", "NotificationOptions", new { id = model.Id }, null));
                columns.Template(model => Html.ActionLink("Refill", "Refill", "Payment", new { id = model.Id }, null));
                columns.Template(model => Html.ActionLink(Strings.Details, "Details", new { id = model.Id }));
                columns.Template(model => Html.ActionLink(Strings.Delete, "Delete", new { id = model.Id }));
                columns.Template(model => Html.CheckBox("invoice", (Boolean)ViewData[@cb])).HeaderTemplate("Invoice Option");                                
                @i++;
                @cb = "checkbox" + i.ToString();
            }
        )
        .Pageable(paging =>
                paging.Enabled(true)
                      .PageSize(UserSettings.GridPageSize)
                      .Style(GridPagerStyles.NextPrevious)
                      .Position(GridPagerPosition.Bottom)
            )
        .Sortable()
        .Scrollable()
        .Resizable(resize=> resize.Columns(true))
)

この全体の問題は、ViewData に格納されているデータに関係なく、チェックボックスがオフのままであることです。私はデバッガーを使用し、それに応じてViewDataで値が設定されていますが、何らかの理由で(まだわかりません)、チェックボックスがオフのままです。

この問題に関するアイデアは大歓迎です。

4

1 に答える 1

0

私はこれらすべての問題を発見しました。流石、わがまま(というか)でした。問題は、グリッド内のすべての行に対して発生すると考えて、Telerik グリッド宣言内の @i 変数をインクリメントしたことですが、それは 1 回しかトリガーされません。したがって、ViewData[@cb]値には常にコントローラーに設定された2番目の値があり(私の場合はfalse)、すべてのチェックボックスがオフになります。

修正:

ViewBag を使用してDictionary<Guid, bool>、値を保持するように設定し、model.Idプロパティを使用して繰り返し処理しました。興味のある方のために、以下にコードを掲載します。

コントローラ:

        ViewBag.Dict = new Dictionary<Guid, bool>();
        Dictionary<Guid, bool> dict = new Dictionary<Guid, bool>();

        foreach (Bucket b in buckets)
        {
            var payByInvoice = db.PaymentOptions.Where(p => p.BucketId == b.Id).Select(p => p.CanPayByInvoice).SingleOrDefault();
            if (payByInvoice != (int)PayByInvoiceState.Accepted)
            {
                dict.Add(b.Id, false);
            }
            if (payByInvoice == (int)PayByInvoiceState.Accepted)
            { 
                dict.Add(b.Id, true);
            }
        }
        ViewBag.Dict = dict; 

意見:

columns.Template(model => Html.CheckBox("invoice", (bool)ViewBag.Dict[model.Id])).HeaderTemplate("Invoice option");
于 2013-04-01T09:07:59.123 に答える