13

私は次のようにテレリックグリッドを持っています:

Html.Telerik().Grid<MatchViewModel>().Name("Matches").Columns(cols =>
             {
                 cols.Bound(e => e.Name);
                 cols.Bound(e => e.Date);
                 cols.Bound(e => e.GuestTeamId);
                 cols.Bound(e => e.HostTeamId);
                 cols.Bound(e => e.PostponedDate);
             ==> cols.Bound(e => e.RefereeId).EditorViewData(new { RefereeName = '' });
                 cols.Bound(e => e.StatusId);
             })

矢印で参照されている列で、EditorTemplate.i の追加データとしてレフリー名を送信したいのですが、EditorViewDataメソッド名からこれを行うのに役立つと推測しましたが、機能させることができません。ありがとう。

4

2 に答える 2

24

ページに適切に定義されたモデルがある場合は、ViewBag または ViewData を使用する必要はありません。EditorViewData を使用すると、オンザフライで ViewData を作成して、追加のデータを EditorTemplate に渡すことができます。

たとえば、グリッド内の各アイテムの EditorTemplate に異なる DropDownList 値を設定したい場合、これを行うには追加のデータを渡す必要があります。EditorViewData を使用すると、コントローラーで ViewBag または ViewData オブジェクトをコーディングする必要なく、まさにその目的のためにモデルから追加の値を追加できます。

私が最初に使用した場所は、ネストされた TabStrip 内の資格グリッドに追加された定義済みの資格を編集できる人物グリッドでした。秘訣は、各人の DropDownList に、すでに獲得した資格を含めたくないということでした。このような...

ピープルグリッド

@using Kendo.Mvc.UI
@model PeopleViewModel
@(Html.Kendo().Grid<PersonModel>()
    .Name("PersonGrid")
    .Columns(columns => {
        columns.Bound(b => b.LastName).EditorTemplateName("_TextBox50");
        columns.Bound(b => b.FirstName).EditorTemplateName("_TextBox50");
...
        columns.Command(cmd => { cmd.Edit(); cmd.Destroy(); }).Width(180);
    })
    .ClientDetailTemplateId("personTemplate")
    .ToolBar(toolbar => toolbar.Create())
    .Selectable()
    .Editable(editable => editable.Mode(GridEditMode.InLine))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Model(model =>
            {
                model.Id(a => a.Id);
            })
        .Create(create => create.Action("CreatePerson", "People"))
        .Read(read => read.Action("ReadPeople", "People"))
        .Update(update => update.Action("UpdatePerson", "People"))
        .Destroy(destroy => destroy.Action("DestroyPerson", "People"))
    )
    .Events(events => events.DataBound("dataBound"))
)
<script type="text/javascript">
    function dataBound() {
        this.expandRow(this.tbody.find("tr.k-master-row").first());
    }
</script>
<script id="personTemplate" type="text/kendo-tmpl">
    @(Html.Kendo().TabStrip()
        .Name("TabStrip_#=Id#")
        .Items(items =>
                    {
...
                        items.Add().Text("Edit Qualifications")
                        .LoadContentFrom("PersonQualifications", "People", new {personId = "#=Id#"});
...
                    })
        .ToClientTemplate()
    )
</script>

PeopleViewModel

継承のことは無視してください。それはこの議論の範囲を超えています。ただし、このトップ レベル ビューに関連するすべてのサブ ビューで同じモデルを使用していることに注意してください。

public class PeopleViewModel : PageViewModel
{
    public int PersonId { get; set; }
    public PersonModel Person { get; set; }
    public IList<QualificationModel> AllQualifications { get; set; }
...

    public PeopleViewModel(BaseViewModel baseViewModel) : base(baseViewModel)
    {}
}

PersonQualifications コントローラー

データ プロバイダーは別の場所に挿入されますが、POCO からモデルへのフラット化に注意してください。これは、モデル コンストラクターに List を適用する単なる静的メソッドです。

public ActionResult PersonQualifications(int personId)
{
    SetBaseContext(HttpContext);
    var model = new PeopleViewModel(BaseViewModel)
                     {
                        PersonId = personId,
                        AllQualifications = QualificationModel.FlattenToThis(_qualificationDataProvider.Read())
                     };
    return View(model);
}

ネストされたグリッド (TabStrip 内にロードされたビュー)

@using Kendo.Mvc.UI
@model PeopleViewModel
@{
    Layout = null;
}
@(Html.Kendo().Grid<PersonQualificationModel>()
    .Name("QualificationEditGrid_" + Model.PersonId)
    .Columns(columns =>
    {
        columns.ForeignKey(f => f.QualificationId, Model.AllQualifications, "Id", "Display")
===>        .EditorViewData(new {personId = Model.PersonId})
            .EditorTemplateName("PersonQualificationDropDownList");
        columns.Command(cmd =>
                            {
                                cmd.Edit();
                                cmd.Destroy();
                                }).Width(180);
    })
    .ToolBar(toolbar => toolbar.Create())
    .DataSource(dataSource => dataSource
        .Ajax()
        .Events(events => events.Error("error_handler"))
        .Model(model => {
            model.Id(a => a.Id);
        })
        .Create(create => create.Action("CreatePersonQualification", "People"))
        .Read(read => read.Action("ReadPersonQualifications", "People", new {personId = Model.PersonId}))   
        .Destroy(destroy => destroy.Action("DestroyPersonQualification", "People"))
    )
)

EditorTemplate (ついに!)

この EditorTemplate を共有するのに役立つ最初の ViewData 参照を無視します。私たちが興味を持っているのはもう少し下です。

@using Kendo.Mvc.UI
@(Html.Kendo().DropDownList()
    .Name(ViewData.TemplateInfo.GetFullHtmlFieldName(""))
    .DataValueField("Id")
    .DataTextField("Name")
    .OptionLabel("Select...")
    .DataSource(dataSource => dataSource
===>    .Read(read => read.Action("ReadDdlQualifications", "People", new {personId = ViewData["personId"]}))
    )
)

コントローラーメソッド(念のため)

public JsonResult ReadDdlQualifications(int personId)
{
    var qualification = _qualificationDataProvider.ReadAvailableToPerson(personId);
    IList<IdNamePair> results = IdNamePair.FlattenToThis(qualification);
    return Json(results, JsonRequestBehavior.AllowGet);
}

明らかに、この例では他にも多くのことが行われています (意味をなすために十分なコードを残しておけばよかったと思います)。

楽しみ。

于 2012-12-05T00:26:30.590 に答える
5

Chad と同じ問題に遭遇しました。Trey が述べたように、これはEditorViewDataに情報を渡すことによって行うことはできません。行データ項目を渡す方法はなく、ページ データのみを渡します。

別の方法として、このスクリプトをエディター テンプレートに追加することもできます。次に、グリッド行からフィールド値にアクセスし、それをデータソース呼び出しに渡し、各行データに基づいてドロップダウン リストをフィルタリングできます。

<script type="text/javascript">

    function getParentId() {
        var row = $(event.srcElement).closest("tr");
        var grid = $(event.srcElement).closest("[data-role=grid]").data("kendoGrid");
        var dataItem = grid.dataItem(row);
        return { EmployeeId: dataItem.EmployeeId };
    }

</script>

次に、データ ソースの読み取りメソッドにデータ項目を追加します。

@(Html.Kendo().DropDownList()
        .Name("Product")
        .DataValueField("ProductId")
        .DataTextField("ProductName")
        .DataSource(ds => ds
            .Read(read => read.Action("ProductsRead", "Home")
                .Data("getParentId")
                ))
)
于 2014-01-24T16:18:25.283 に答える