Why are kendo grid pager controls getting duplicated? - asp.net-mvc

I have a very wired problem.
My kendo grid pager controls are getting rendered twice after I updated kendo files.
Someone knows something about this. I'm using Kendo for ASP.NET MVC.Here you have an image of the grid
The second group of buttons are the ones that works. Buttons to the right and left of the pagination numbers are blocked.
#(Html.Kendo().Grid<Monibyte.Arquitectura.Presentacion.Transaccional.Dto.Tarjetas.PocMovimientosTarjeta>()
.Name("Grid")
.Filterable()
.Groupable()
.ColumnMenu()
.AutoBind(false)
.Events(e => e.DataBound("OndataBound"))
.Events(e => e.DataBinding("OnDataBinding"))
.Reorderable(reorderable => reorderable.Columns(true))
.Pageable(pager => pager.PageSizes(Html.DefaultPageSizes()))
.Selectable(selectable => selectable.Mode(GridSelectionMode.Single))
.Sortable(sortable => sortable.AllowUnsort(true).SortMode(GridSortMode.MultipleColumn))
.Columns(columns =>
{
columns.Bound(p => p.IdMovimiento).Title("").Sortable(false).Filterable(false).Width(50)
.HtmlAttributes(new { #class = "detAdic_ListMov" }).IncludeInMenu(false)
.HeaderTemplate(Html.GridCheckAll()).ClientTemplate(Html.GridCheck() +
Html.GenericGridBtn("IncluirDetalleMovimiento", "ConsultaMovimientos", null,
altText: #RecEtiquetas.App_AgregarMovimiento,
jsparams: new
{
targetId = "detalleMovimiento",
dataFunc = "editarDataFunc",
callback = "editarCallback"
},
imageUrl: "imagenes/iconos/list(16).png",
authorizeFunc: "validaSegregar").ToHtmlString())
.HtmlAttributes(new { #class = "detAdic_ListMov", #title = #RecEtiquetas.App_AgregarMovimiento });
columns.Bound(p => p.NumTarjeta).Title(RecEtiquetas.Mod_NumTarjeta).Hidden(true).Width(50)
.ClientGroupHeaderTemplate("#= templateDescripcionTarjeta(value) #")
.HtmlAttributes(new { #title = #RecEtiquetas.Mod_NumTarjeta });
columns.Bound(p => p.NumReferencia).Title(RecEtiquetas.App_Referencia).Width(30)
.HtmlAttributes(new { #title = #RecEtiquetas.App_Referencia });
columns.Bound(p => p.FecMovimiento).Title(RecEtiquetas.App_FechaMovimiento).Width(40)
.ClientTemplate("#:$monibyte.formatDate(FecMovimiento)#")
.HtmlAttributes(new { #title = #RecEtiquetas.App_FechaMovimiento });
columns.Bound(p => p.FecTransaccion).Title(RecEtiquetas.App_FecConsumo).Hidden(true).Width(40)
.ClientTemplate("#:$monibyte.formatDate(FecTransaccion)#")
.HtmlAttributes(new { #title = #RecEtiquetas.App_FecConsumo });
columns.Bound(p => p.Descripcion).Title(RecEtiquetas.App_DescripcionMovimiento).Width(250)
.HtmlAttributes(new { #title = #RecEtiquetas.App_Descripcion });
columns.Bound(p => p.MonDebLocal).Title(Html.EtiquetasCompania("RecGlobalizacion", "App_DebitoMonedaLocal").ToString()).Width(40)
.ClientTemplate("#:SimboloMonedaLocal# #:$monibyte.formatNumber(MonDebLocal)#")
.ClientGroupFooterTemplate("#:templateMontoDebLocal(data)#")
.FooterHtmlAttributes(new { #class = "alinearDerecha" })
.HtmlAttributes(new { #class = "alinearDerecha monto-grid", #title = Html.EtiquetasCompania("RecGlobalizacion", "App_DebitoMonedaLocal") });
columns.Bound(p => p.MonCredLocal).Title(Html.EtiquetasCompania("RecGlobalizacion", "App_CreditoMonedaLocal").ToString()).Width(40)
.ClientTemplate("#:SimboloMonedaLocal# #:$monibyte.formatNumber(MonCredLocal)#")
.ClientGroupFooterTemplate("#:templateMontoCredLocal(data)#")
.FooterHtmlAttributes(new { #class = "alinearDerecha" })
.HtmlAttributes(new { #class = "alinearDerecha monto-grid", #title = Html.EtiquetasCompania("RecGlobalizacion", "App_CreditoMonedaLocal") });
columns.Bound(p => p.MonDebInter).Title(RecEtiquetas.App_DebitoDolares).Width(40)
.ClientTemplate("#:SimboloMonedaInter# #:$monibyte.formatNumber(MonDebInter)#")
.ClientGroupFooterTemplate("#:templateMontoDebInter(data)#")
.FooterHtmlAttributes(new { #class = "alinearDerecha" })
.HtmlAttributes(new { #class = "alinearDerecha monto-grid", #title = #RecEtiquetas.App_DebitoDolares });
columns.Bound(p => p.MonCredInter).Title(RecEtiquetas.App_CreditoDolares).Width(40)
.ClientTemplate("#:SimboloMonedaInter# #:$monibyte.formatNumber(MonCredInter)#")
.ClientGroupFooterTemplate("#:templateMontoCredInter(data)#")
.FooterHtmlAttributes(new { #class = "alinearDerecha" })
.HtmlAttributes(new { #class = "alinearDerecha monto-grid", #title = #RecEtiquetas.App_CreditoDolares });
columns.Bound(p => p.DescripcionMoneda).Title(RecEtiquetas.App_Moneda).Hidden(true).Width(40)
.ClientGroupHeaderTemplate(RecEtiquetas.App_TotalRegistros + " #=value# = #=count#")
.HtmlAttributes(new { #title = #RecEtiquetas.App_Moneda });
})
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(Html.DefaultPageSize())
.Sort(sort => sort.Add(p => p.FecMovimiento).Descending())
.Aggregates(aggregates =>
{
aggregates.Add(p => p.MonCredLocal).Sum();
aggregates.Add(p => p.MonDebLocal).Sum();
aggregates.Add(p => p.MonCredInter).Sum();
aggregates.Add(p => p.MonDebInter).Sum();
aggregates.Add(p => p.DescripcionMoneda).Count();
aggregates.Add(p => p.SimboloMonedaLocal).Min();
aggregates.Add(p => p.SimboloMonedaInter).Min();
})
.Group(groups => groups.Add(p => p.DescripcionMoneda))
.Read(read => read.Action("FiltrarMovimientos", "ConsultaMovimientos"))
))

I contacted Progress Telerik support and this is the answer they gave.
We had reports about such an issue recently. The customers who encountered it had updated UI for ASP.NET MVC to the latest version
but forgot to update the Kendo UI script and CSS files, or vice versa.
Could you double check if you updated both the DLL and the JS and CSS
files? To check the current Kendo UI scripts version in your page, you
can call:
console.log(kendo.version);
To check the DLL version, open the References folder in your project,
right-click Kendo.Mvc and select Properties.
The two versions have to match in order to have the widgets working
correctly
So check your dll and js/css versions match.

Had the same issue with kendo 2018.1.221. The issue was fixed when the jquery is loaded after the kendo javascript bundle
#Styles.Render("~/Content/kendo/2018.1.221/css")
#Scripts.Render("~/bundles/kendo/2018.1.221/kendoscripts")
//jquery needs to be loaded after kendo scripts
#Scripts.Render("~/bundles/jquery")

The reason why I was getting duplicate paging was because the Kendo.MVC.dll in the project did not match the Kendo css & scripts version used by the bundles.
Remove the Kendo.Mvc dll in your project and re-add from the local path. eg.
\Telerik UI for ASP.NET MVC R2 2018\wrappers\aspnetmvc\Binaries\Mvc4Kendo.Mvc.dll
(Same answer as Steven Anderson)

Related

Kendo MVC Grid will not hide columns with media query

My Kendo grid incorrectly displays the responsive column when the page is viewed on a desktop (width > 2000px). My grid code is below. It seems like .Media("(max-width: 450px)"); in the last column doesn't work. It renders fine on a small screen. Only the last column is displayed.
<% Html.Kendo().Grid<WWT.Models.GageList>()
.Name("StationGrid")
.Selectable(s => s.Mode(Kendo.Mvc.UI.GridSelectionMode.Single))
.Filterable(filter =>
{
filter.Extra(false);
filter.Operators(op =>
{
op.ForString(str => str.Clear());
op.ForString(str =>
{
str.Clear().Contains("Contains");
});
});
filter.Mode(GridFilterMode.Row);
})
.Sortable(a => a.Enabled(true))
.Events(events => events
.DataBound("onDataBound")
.Change("AddRowClick")
)
.Pageable(pageable => pageable
.Refresh(true)
.PageSizes(true)
.ButtonCount(5))
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("IndexReplaceStation", "Window", new { company = Model.company, gageSN = Model.id, model = Model.model }).Data("GridSearchData"))
.PageSize(20)
)
.Columns(columns =>
{
columns.Bound(c => c.ModelNumber).Title("Model").HtmlAttributes(new { #class = "telerikGridCell" }).MinScreenWidth(450);
columns.Bound(c => c.SID).Title("SID").HtmlAttributes(new { #class = "telerikGridCell" }).MinScreenWidth(450);
columns.Bound(c => c).ClientTemplate("#=resColTemplate(data)#").Title("").Media("(max-width: 450px)");
})
.Scrollable(scrolling => scrolling.Height(150))
.Render();
%>
</div>
<script id="responsive-column-template" type="text/x-kendo-template">
<strong>Model</strong>
<p class="col-template-val">#=data.ModelNumber#</p>
<strong>SID</strong>
<p class="col-template-val">#=data.SID#</p>
</script>
I use min-width at 320 and 850px breakpoints.
cols.Bound(x => x.SectionCode)
.HeaderHtmlAttributes(new { style = "text-align:center" })
.Media("(min-width: 320px)")
.Width("25%");

Column Client Template in GRID

I am Migrating the app from MVC 5 to Core 2.0. We are facing issue with the grid client template as we are unable to use it when we use it along with the editable property. Following is the code.
#(Html.Kendo().Grid<PPVR>()
.Name("PPVRGird")
.Columns(columns =>
{
columns.Bound(e => e.Id).Hidden();
columns.Bound(c => c.Name);
columns.Bound(c => c.Quantity);
columns.Bound(c => c.Type);
columns.Bound("").ClientTemplate("<div style='text-align:center'><a href='javascript:void(0)' class='k-grid-edit custom-action-button'onclick='customGridEditClick(this)'><img src='/Content/edit.svg' width ='40' height='40'/><br/>Edit</a></div>").HeaderHtmlAttributes(new { #class = "custom-action-button" }).Title("Edit").Width(150);
columns.Bound("").ClientTemplate("<div style='text-align:center'><a href='javascript:void(0)' class='custom-action-button pull-center' onclick='deletePayPerViewRules(#=Id#)'><img src='/Content/trashed.svg' width='40' height='40' /><br />Delete</a></div>").HeaderHtmlAttributes(new { #class = "custom-action-button" }).Width(200);
})
.Pageable()
.HtmlAttributes(new { style = " text-align:left; font-family:lato; font-size:16px; " })
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(100)
.Read(read => read.Action("GetPPVR", "PPV"))
.Model(model =>
{
model.Id(u => u.Id);
model.Field(u => u.Type).Editable(false);
})
.Update(update => update.Action("UpdatePPVR", "PPV")))
.Editable(editable => editable.Mode(GridEditMode.InLine))
)
This brings the empty page. When I comment the line .Editable(editable => editable.Mode(GridEditMode.InLine)) page appears. It works well in MVC 5 but not in core 2.0.
Kindly suggest how can I achieve this.
UPDATE => This issue is coming only when I am using Inline option for editing when I use Pop Up then it works fine.
Okay after 2 days of waiting I got the response from Telerik Team.
A possible solution is to bind the desired columns to any field, and using the columns.editable configuration to prevent editing for these columns.
https://docs.telerik.com/kendo-ui/api/javascript/ui/grid/configuration/columns.editable
columns.Bound(p => p.Freight).ClientTemplate("Hi").HeaderHtmlAttributes(new { #class = "custom-action-button" }).Width(200).Editable("function(){return false;}");
columns.Bound(p => p.Freight).ClientTemplate("Bye").HeaderHtmlAttributes(new { #class = "custom-action-button" }).Title("Sample").Width(150).Editable("function(){return false;}");
Telerik Team Answer
It seems to be a workaround for me but it worked fine.
Hope this question saves someother people time as well.

DatasourceRequest always return null when Kendo grid is in PopUp

I am trying to open kendo grid in popup on clicking of link. Kendo grid Opens in popup perfectly, but filtering and sorting functionality is not working. I am using server side Operation. When I sort particular column In controller side in DatasourceRequest I always gets value as null.
Any help is highly appreciated..
<div class="panel-body" id="countryImageData">
#(Html.Kendo().Grid(Model.GlobalInventoryImages)
.Name("InventoryCountryImageDetailsGrid")
.Columns(columns =>
{
columns.Bound(p => p.SmartInventoryID).Hidden().Title("SPC #").HtmlAttributes(new { #id = "CountrySmartInventory_Grid" });
columns.Bound(p => p.SubwayProductCode).Width(50).Title("SPC #").HtmlAttributes(new { #id = "CountrySubwayProductCode_Grid" });
columns.Bound(p => p.GlobalCaseImageName).Width(100).Title("Case Images").HtmlAttributes(new { #id = "GlobalCaseGraphicName_Grid" }).ClientTemplate(" #=GlobalCaseImageName# ");
columns.Bound(p => p.GlobalInnerImageName).Width(100).Title("Inner Images ").HtmlAttributes(new { #id = "GlobalInnerImageName_Grid" }).ClientTemplate(" #=GlobalInnerImageName# ");
columns.Bound(p => p.CountryNames).Width(100).Title("Country").HtmlAttributes(new { #id = "CountryNames_Grid" });
})
.Pageable(pager => pager.PageSizes(new int[] { 25, 50, 75, 100 }).Input(true))
.Sortable(e => e.AllowUnsort(true).SortMode(GridSortMode.MultipleColumn))
.Scrollable()
.ColumnMenu()
.NoRecords("No Records")
.Selectable(e => e.Mode(GridSelectionMode.Multiple))
.Filterable()
.ColumnResizeHandleWidth(10)
.ColumnResizeHandleWidth(10)
.Resizable(resize => resize.Columns(true))
.Reorderable(reorder => reorder.Columns(true))
.HtmlAttributes(new { #class = "custom-kendo-grid custom-kendo-grid-inv" })
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(true)
.PageSize(25)
.Read(read => read.Action("InventoryImage_Read", "Inventory").Data("function onCountryAdditonalData(){ return {subwayProductCode: $('#SubwayProductCode').val()};}"))
)
)
</div>
With MVC you have to add the following in your dataSource:
type: 'aspnetmvc-ajax'
for the filter and sort not to be null. Also, your Action method in your MVC Controller must have parameters set up like so:
public async Task<ActionResult> InventoryImage_Read([DataSourceRequest] DataSourceRequest )
You didn't post your MVC Controller Action so I wasn't sure if you had that part set up correctly. I hope this helps.

Customizing Grid of Kendo UI

By default grid of Kendo shows values of columns but I'd like to customize it. For example I want to show an icon for each value of one column.
I have a column in my grid that shows the status of activation or inactivation.Instead of showing "true" or "false", I want to show an icon that is proper for it.
I've used ".Template()" in grid but my code in ".Template" did not fire!
How can I solve this problem?
<div style="width: 100%;">
#(Html.Kendo().Grid<Jahan.Blog.Model.Article>()
.Name("ArticleAdmin").Navigatable()
.Resizable(c => c.Columns(true))
.HtmlAttributes(new { #class = "cursorLink", #style = "width: 1000px;height:auto;overflow: scroll;" })
.Columns(columns =>
{
columns.Bound(p => p.UserId).Width(100);
columns.Bound(p => p.Title).Width(200);
//columns.Bound(p => p.Summary).Width(140);
//columns.Bound(p => p.Description).Width(100);
columns.Bound(p => p.LikeCounter).Width(100);
columns.Bound(p => p.RateCounter).Width(100);
// Please attention to this
columns.Bound(p => p.IsActive).Template(p => #Html.ShowIcon(p.IsActive)).Width(80);
columns.Bound(p => p.IsActiveNewComment).Width(170);
columns.Bound(p => p.CreatedDate).Width(160).Format("{0:G}");
columns.Bound(p => p.ModifiedDate).Width(160).Format("{0:G}");
columns.Command(command => command.Destroy()).Width(170);
})
.ToolBar(toolbar =>
{
toolbar.Create();
toolbar.Save();
})
.Editable(editable => editable.Mode(GridEditMode.InCell))
.Pageable()
.Navigatable()
.Sortable()
.Scrollable()
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.PageSize(20)
.ServerOperation(false)
.Events(events => events.Error("error_handler"))
.Model(model => model.Id(p => p.Id))
.Create("Editing_Create", "ArticleAdmin")
.Read("Editing_Read", "ArticleAdmin")
.Update("Editing_Update", "ArticleAdmin")
.Destroy("Editing_Destroy", "ArticleAdmin")
))
</div>
Please attention to this part of my code:
columns.Bound(p => p.IsActive).Template(p => #Html.ShowIcon(p.IsActive)).Width(80);
and
public static MvcHtmlString ShowIcon(this HtmlHelper html, bool isActive, string text = "", string activeCssClass = "glyphicon glyphicon-ok", string inactiveCssClass = "glyphicon glyphicon-remove")
{
StringBuilder result = new StringBuilder();
TagBuilder span = new TagBuilder("span");
span.SetInnerText(text);
if (isActive)
{
span.AddCssClass(activeCssClass);
}
else
{
span.AddCssClass(inactiveCssClass);
}
result.Append(span);
return MvcHtmlString.Create(result.ToString());
}
You can do this with a ClientTemplate as follows:
columns.Bound(p => p.IsActive)
.ClientTemplate("<img src='/Content/#= IsActive ? 'tick.png' : 'cross.png' #''>");
The above simply checks the IsActive property and displays a tick or cross image.
columns.Bound(p => p.IsActive).ClientTemplate("#= showIcon(IsActive) #").Width(80);
JavaScript function:
function showIcon(isActive) {
var result = "";
if (isActive == true) {
result = "<img src='/Content/tick.png'/>";
} else {
result = "<img src='/Content/cross.png'/>";
}
return result;
}
for more information click How do I use a JavaScript function in a column client template?

How to pass the model of a row from Kendo Grid to an editable template

I have a Kendo Grid which has a popup editable template,
If possible i would like to pass the model (the model of the row, or at least its Id) to the editable template
Grid
#(Html.Kendo().Grid<Client>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(c => c.Name).Width(140);
columns.Bound(c => c.Status);
columns.Bound(c => c.ProcesingStyle);
columns.Bound(c => c.ArchiveDays);
columns.Command(command =>
{
command.Edit().Text(" ");
command.Destroy().Text(" "); ;
}).Width(90);
})
.ToolBar(toolbar => toolbar.Create().Text("New"))
.Editable(editable => editable
.Mode(GridEditMode.PopUp)
.TemplateName("Client").AdditionalViewData(new { Client = Model })
.Window(w => w.Title("Site")))
.HtmlAttributes(new { style = "height: 380px;" })
.Scrollable()
.Sortable()
.Selectable()
.Resizable(resize => resize.Columns(true))
.Reorderable(reorder => reorder.Columns(true))
.Events(events => events.Change("onChange"))
.Pageable(pageable => pageable
.Refresh(true)
.PageSizes(true)
.ButtonCount(5))
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("Get", "Clients"))
.Model(model => model.Id(p => p.Id))
.Create(update => update.Action("Create", "Clients"))
.Update(update => update.Action("Update", "Clients"))
.Destroy(update => update.Action("Destroy", "Clients"))
)
)
Template
#model Client
#(Html.Kendo().ComboBoxFor(m => m.Plan)
.DataTextField("Name")
.DataValueField("Id")
.Placeholder("Select Plan...")
.HtmlAttributes(new { style = "width:300px" })
.Filter(FilterType.Contains)
.MinLength(3)
.DataSource(source =>
source.Read(read =>
read.Action("GetPlans", "Plans",new {ClientId = Model.Id}))))
Everything works fine except i need to use the Id of the row/model inside the template, in particular , i need the to pass the model.Id (which is the id of the model of the row), to the action on the Combobox in the template, so i can filter the data correctly
This is the offending line in the grid,
.TemplateName("Client").AdditionalViewData(new { Client = Model })
The result is the Model inside the template is always null, im not sure how to pass the data i need to the template
Is there anyway i can do this, or should i be looking at a different approach?
The way I got around this was to put a JavaScript function in the original view as seen below:
function getClientId() {
var row = $(event.srcElement).closest("tr");
var grid = $(event.srcElement).closest("[data-role=grid]").data("kendoGrid");
var dataItem = grid.dataItem(row);
if (dataItem)
return { clientId: dataItem.Id }
else
return { clientId: null }
}
And reference it from my editor template:
.DataSource(source => source.Read(read => read.Action("GetPlans", "Plans").Data("getClientId"))))
Note : I'm pretty sure you cant run JavaScript from a EditorTemplate so it needed to be housed in the original view.
I know this is a really old question, but for those who are wondering why this doesn't work:
.TemplateName("Client").AdditionalViewData(new { Client = Model })
This code doesn't work because the only data you can pass through this method is static data. You can pass specific strings or numbers, like "Hello World", and that would work fine. For dynamic data with kendo, I've learned that it really depends on the situation, and your solution here works well.

Resources