5

これらの列の1つがforeignKey列であるいくつかの列を持つグリッドがあります。

その列のすべての可能な値をコンボボックスに表示したいと思います。State にはViewData["States"]フィールドとフィールドがあります。IList<State>IdName

それを実現するために、テンプレート「GridForeignKey.cshtml」を次のように変更しました。

@model object

@(
 Html.Kendo().ComboBoxFor(m => m)        
    .BindTo((SelectList)ViewData[ViewData.TemplateInfo.GetFullHtmlFieldName("") +  
   "_Data"]).Filter(FilterType.Contains).Placeholder("Select...")
)

私のビューは次のようになります。

<div class="contentwrapper">
    @{
        ViewBag.Title = "Home Page";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }

    @(
    Html.Kendo().Grid<CustomerModel>()    
    .Name("Grid")
    .Columns(columns => {
        columns.Bound(p => p.Name);

        columns.ForeignKey(p => p.StateId, (IEnumerable)ViewData["States"], "Id", "Name");

        columns.Bound(p => p.StreetAddress).Width(140);
        columns.Bound(p => p.Zip).EditorTemplateName("Integer");
        columns.Command(command => { command.Edit(); command.Destroy(); });//edit and delete buttons
    })
    .ToolBar(toolbar => toolbar.Create())//add button
    .Editable(editable => editable.Mode(GridEditMode.InLine))//inline edit
    .Pageable()
    .Sortable()
    .Scrollable()
    .Filterable()
    .DataSource(dataSource => dataSource        
        .Ajax()                 
        .Events(events => events.Error("error_handler"))
        .Model(model => {
            model.Id(c => c.CustomerId);
            model.Field(c => c.CustomerId).Editable(false);
            model.Field(c => c.Zip).DefaultValue(4444);
        }
        )//id of customer
        .Create(update => update.Action("EditingInline_Create", "Customer"))
        .Read(read => read.Action("EditingInline_Read", "Customer"))
        .Update(update => update.Action("EditingInline_Update", "Customer"))
        .Destroy(update => update.Action("EditingInline_Destroy", "Customer"))
    )
)
</div>
<script type="text/javascript">
    function error_handler(e) {
        if (e.errors) {
            var message = "Errors:\n";
            $.e`enter code here`ach(e.errors, function (key, value) {
                if ('errors' in value) {
                    $.each(value.errors, function () {
                        message += this + "\n";
                    });
                }
            });
            alert(message);//show error
        }
    }
    </script>

今私の問題:

  1. 私のテーブルには、「状態」の選択された値が表示されません。
  2. 行を編集すると、コンボボックスが表示され、目的の値がすべて含まれていますが、値が選択されていません。代わりに、常にプレースホルダー テキストが表示されます。
  3. 複雑なオブジェクトをグリッドにバインドする前に、それ自体が複合型 (および属性Stateを含む) であるフィールドを持っていましたが、どういうわけか剣道では のようにバインドできませんでした。そのため、モデルをフラット化し、代わりにフィールドを使用しています。このようなカスケードされた複合型を使用することさえ可能ですか?IdNamep => p.State.IdStateId
4

2 に答える 2

3

あなたが持っているものは機能しません。EditorTemplate に EditorViewData のリストを渡し、使用する EditorTemplateName を指定する必要があります。

columns.ForeignKey(p => p.StateId, (IEnumerable)ViewData["States"], "Id", "Name")
    .EditorViewData(new { statesList = ViewData["States"] })
    .EditorTemplateName("GridForeignKey");

そして GridForeignKey.cshtml のような

@model int // Assuming Id is an int
@(Html.Kendo().ComboBoxFor(m => m)
    .Placeholder("Select...")
    .DataValueField("Id")
    .DataTextField("Name")
    .BindTo(ViewData["statesList"])
)

頭のてっぺんからやっただけなので、これは正確ではないかもしれません。しかし、少なくとも正しい方向に進むはずです。

于 2013-02-21T04:30:50.420 に答える