2013-08-29 27 views
6

Sunucu tarafı ciltlemesinden ajax kullanmaya geçtiğim iki katmanlı bir hiyerarşik ızgaram var. Her iki veri katmanı için ajax okumaları doğru şekilde çalışıyor, ancak sütunlarımı koşullu mantığa göre işlemek için ClientTemplate'i kullanmakta zorluk çekiyorum.Bir mvc kendo ızgarasının ajax bağında istemci şablon ifadeleri nasıl kullanılır?

Sunucu tarafı ciltleme sürümü aşağıdadır. Ben de aynı etki için ClientTemplate ve ifadeleri # = # kullanmak zorunda anlıyorum ama iki sorun yaşıyorum:

  1. Nasıl değişken 'i' her satır için bu yüzden CheckBoxFor kullanmak ve html yardımcı yöntemler gibi olabilir artırmak için?
  2. @ ClientTemplate ifadesini kullanmak için @ nasıl dönüştürülür. koşullu lojik en yararlı olacak bir ifade, bu dönüştürme model

gelen bir özellikler karışımı kullanılarak adlı Modelinin özellikleri ve aynı zamanda şartlı mantığı ile bağlanmış eleman (MyViewModel) özelliklerini kullanır.

var i = -1; 

@(Html.Kendo().Grid<MyViewModel>() 
    .Name("grid") 
    .Columns(columns => 
    { 
    columns.Bound(c => c.Selected).Title("") 
     .Template(
     @<text> 
      @{i++;} 
      @if (Model.Permissions.HasInsertAccess && item.Status == Status.Created) 
      { 
      <input type="hidden" name="MyViewModels.Index" value="@i" /> 
      @Html.CheckBoxFor(m => m.MyViewModels[i].Selected) 
      } 
      </text>); 

      columns.Bound(c => c.Id) 
      .Template(@<text>@Html.HiddenFor(m => m.MyViewModels[i].Id)@item.Id</text>) 

cevap

5

Lütfen aşağıdaki kod parçacığı ile deneyin.

GÖRÜNÜM

@model MvcApplication1.Models.TestModels 

<script type="text/javascript"> 
var rowNumber = 0; 

function resetRowNumber(e) { 
    rowNumber = 0; 
} 

function renderNumber(data) { 
    return ++rowNumber; 
} 

function renderRecordNumber(data) { 
    var page = parseInt($("#Grid").data("kendoGrid").dataSource.page()) - 1; 
    var pagesize = $("#Grid").data("kendoGrid").dataSource.pageSize(); 
    return parseInt(rowNumber + (parseInt(page) * parseInt(pagesize))); 
} 

</script> 
@(Html.Kendo().Grid<MvcApplication1.Models.TestModels>() 
.Name("Grid") 
.Columns(columns => 
{ 
    columns.Bound(p => p.ID); 
    columns.Bound(p => p.Name); 

    columns.Template(t => { }).Title("Row No").ClientTemplate("# if ('" + @Model.Permissions.HasValue.ToString().ToLower() + "' == 'true') { #" + 
     "<input type='text' name='MyViewModels.Index' value='#= renderNumber(data) #' /> " + 
     "# } #"); 

}) 
.Pageable(x => x.PageSizes(new int[] { 10, 20, 30, 50 }).Refresh(true)) 
.Sortable() 
.Filterable() 
.DataSource(dataSource => dataSource 
    .Ajax() 
     .Read(read => read.Action("Grid_Read", "Home")) 

) 
    .Events(ev => ev.DataBound("resetRowNumber")) 
) 

KONTROL

public ActionResult Index() 
{ 
     TestModels model = new TestModels(); 
     model.Permissions = true; //Please comment this line and check 
     return View(model); 
} 

public ActionResult Grid_Read([DataSourceRequest] DataSourceRequest request) 
{ 
     List<TestModels> models = new List<TestModels>(); 

     for (int i = 0; i < 50; i++) 
     { 
      TestModels t1 = new TestModels(); 
      t1.ID = i; 
      t1.Name = "Name" + i; 
      models.Add(t1); 

     } 

     return Json(models.ToDataSourceResult(request)); 
} 

MODEL

public class TestModels 
{ 
    [Display(Name = "ID")] 
    public int ID { get; set; } 

    [Display(Name = "Name")] 
    public string Name { get; set; } 

    public bool? Permissions { get; set; } 
} 

yukarıdaki ile deneyin kod parçacığı. Herhangi bir endişeniz varsa bildirin.

+1

Teşekkürler, iyi çalışıyor. Bir satır artışı kullanmak yerine kendo-grid tarafından oluşturulan uid kullanmaya karar verdim. Ben şimdi ugly html yazmak zorunda olduğu gibi müşteri şablonu mvc html sınıfları ile iyi çalışmıyor bir utanç var. Sunucuları ajax ciltleme ile karıştırmanın mümkün olup olmadığını biliyor musunuz? Modelden ilk ızgara ve sonra ajax araması yapmak için satırı genişlettiğinizde? Boşuna pek çok yol denedim. – David