2014-01-09 2 views
2
@(Html.Kendo().Grid((IEnumerable<Doc.Web.Models.Common.ContactModel>)Model.contact_lst) 
    .Name("grid") 
    .Columns(columns => 
    { 

     columns.Bound(o => o.ContactID).Visible(false); 
     columns.Bound(o => o.ContactName).Title("Contact Name"); 
     columns.ForeignKey(p => p.CPOID, (System.Collections.IEnumerable)ViewData["CPOs"], "cpo_id", "contract_po") 
       .Title("Company - Contact/Purchase Order"); 
     columns.Command(command => { command.Edit(); command.Destroy(); }).Width(182); 
    }) 
    .ToolBar(toolbar => toolbar.Create()) 
    .Editable(editable => editable.Mode(GridEditMode.InLine)) 
    .Pageable() 
    .Sortable() 
    .Filterable() 
    .ToolBar(toolbar => 
    { 
     toolbar.Template(@<text> 
      <div class="toolbar"> 
       <a href="/Contact/EditingInline_Read?grid-mode=insert" class="k-button k-button-icontext k-grid-add"> 
    <span class="k-icon k-add"></span>Add New Record 
</a> 
        <label class="category-label" for="category">Site:</label> 
         @(Html.Kendo().DropDownListFor(m => m.SiteID) 
          .Name("SiteID") 
          .DataTextField("Text") 
          .DataValueField("Value") 
          .Events(e => e.Change("categoriesChange")) 
          .Value(Model.SiteID.ToString()) 
          .DataSource(ds => 
          { 
           ds.Read("ToolbarTemplate_Categories", "Contact"); 
          }) 
         ) 

         </div> 

     </text>); 
    }) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .PageSize(20) 
     .Events(events => events.Error("error_handler")) 
     .Model(model => model.Id(p => p.ContactID)) 
     .Create(update => update.Action("EditingInline_Create", "Contact").Data("additionalInfo")) 
     .Read(read => read.Action("EditingInline_Read", "Contact").Data("additionalInfo")) 
     .Update(update => update.Action("EditingInline_Update", "Contact").Data("additionalInfo")) 
     .Destroy(update => update.Action("EditingInline_Destroy", "Contact").Data("additionalInfo")) 

    ) 
) 

헤더 템플릿의 SiteID 드롭 다운 변경 이벤트에서 외래 키 열 값을 다시 바인딩하려고합니다. "EditingInline_Read"이벤트에서 시도했지만 ViewBag 값이 업데이트되지 않습니다. 어떤 제안?Kendo Grid 동적으로 외래 키 열 바인딩

답변

12

켄도 그리드는 동적 리 바인딩을 지원하지 않습니다. 가장 가까운 것은 AJAX를 사용하여 데이터를 바인딩하는 사용자 정의 편집기 템플릿 을 정의하는 것입니다.

columns.ForeignKey(p => p.CPOID, 
(System.Collections.IEnumerable)ViewData["CPOs"], "cpo_id", "contract_po") 
.Title("Company - Contact/Purchase Order") 
.EditorTemplateName("RemoteForeignKey"); 

RemoteForeignKey 편집기 템플릿

@model int 

@(Html.Kendo().DropDownListFor(m => m) 
    .DataSource(source => 
    { 
     source.Read(read => 
     { 
      read.Action("actionName", "controllerName").Type(HttpVerbs.Post).Data("dataFunc"); 
     }).ServerFiltering(false); 
    }) 
    .DataValueField("cpo_id") 
    .DataTextField("contract_po") 
) 

dataFunc 자바 스크립트 함수

function dataFunc() { return { SiteID: $("#SiteID").val() // here we pass the site ID to server }; } 

및 서버 기능

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult actionName(int? SiteID) 
{ 
    if (SiteID != null) 
    { 
     var objects = (from obj in db.tableName 
         where obj.SiteID == SiteID.Value 
         select new 
         { 
          cpo_id = obj.cpo_id, 
          contract_po = obj.contract_po 
         }).ToList().Distinct().OrderBy(obj => obj.contract_po); 
      return Json(objects); 
    } 
    return null; 
} 

그러면 드롭 다운의 값이 SiteID 입력의 현재 값으로 필터링됩니다.