2013-08-29 7 views
6

Ho una griglia gerarchica a due livelli che sto passando dal binding lato server all'utilizzo di ajax. L'ajax legge che entrambi i livelli di dati funzionano correttamente, tuttavia ho difficoltà a utilizzare ClientTemplate per eseguire il rendering delle colonne in base alla logica condizionale.Come utilizzare le espressioni modello client nel bind ajax di una griglia di kendo mvc?

Di seguito è riportata la versione vincolante sul lato server. Capisco che devo usare ClientTemplate ed espressioni # = # per lo stesso effetto ma sto avendo due problemi:

  1. Come incremento variabile 'i' per ogni riga in modo da poter usare CheckBoxFor e come i metodi HTML helper?
  2. Come convertire il @ per utilizzare l'espressione ClientTemplate. Si noti la logica condizionale utilizza le proprietà del modello della vista e anche proprietà dell'elemento legato (MyViewModel) con la logica condizionale utilizzando una miscela di oggetti di Modello

conversione di questo ad un'espressione sarebbe più utile.

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>) 

risposta

5

Si prega di provare con il snippet di codice qui sotto.

VISTA

@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")) 
) 

CONTROLLER

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)); 
} 

MODELLO

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

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

    public bool? Permissions { get; set; } 
} 

Si prega di provare con quanto sopra snippet di codice. Fammi sapere se c'è qualche preoccupazione.

+1

Grazie, funziona bene. Invece di usare un incremento di riga ho deciso di usare l'uid generato dalla griglia di kendo. È un peccato che il modello del client non funzioni bene con le classi html di mvc dato che ora devo scrivere il brutto html. Sai se è possibile mescolare serveride con l'associazione ajax? La prima griglia dal modello e poi quando espandi la riga per effettuare una chiamata ajax? Ho provato numerosi modi senza risultato. – David