Telerik Forums
UI for ASP.NET Core Forum
1 answer
104 views

I'm encountering a difficult to troubleshoot issue with a Kendo Grid apparently crashing when I attempt to export its contents to an excel file.  I've successfully set up Kendo Grids to export to excel before, and my code here is very closely based on other solutions I've had in similar projects.  Below is the widget code:

@(
    Html.Kendo().Grid(Model.Groups)
    .Name("Grid")
    .Columns(columns =>
    {
        columns.Bound(c => c.SamAccountName).Title("SamAccount").Width(250).HeaderHtmlAttributes(new { style = "font-weight: bold" });
        columns.Bound(c => c.DistinguishedName).Title("Full Name").Width(400).HeaderHtmlAttributes(new { style = "font-weight: bold" });
        columns.Bound(c => c.IsSecurityGroup)
            .Width(75)
            .Title("Security Group?")
            .ClientTemplate("#= IsSecurityGroup ? 'Yes' : 'No' #")
            .HeaderHtmlAttributes(new { style = "font-weight: bold" });
    })
    .Sortable()
    .Selectable(selectable => selectable
        .Mode(GridSelectionMode.Multiple)
        .Type(GridSelectionType.Cell))
    .Navigatable()
    .AllowCopy(true)
    .ToolBar(tools =>
    {
        tools.Custom().Text("Copy to Clipboard").HtmlAttributes(new { id = "copyButton" });
        tools.Excel();
        tools.Search();
    }).Excel(excel =>
    {
        excel.FileName(Model.SearchString + "GroupsExport_" + DateTime.Now.Date.ToShortDateString() + ".xlsx");
        excel.AllPages(true);
        excel.ForceProxy(true);
        excel.ProxyURL(Url.Action("ExcelExportSave", "Home"));
    })
)

And below is the corresponding action in my HomeController:

        [HttpPost]
        public ActionResult ExcelExportSave(string contentType, string base64, string fileName)
        {
            var fileContents = Convert.FromBase64String(base64);
            return File(fileContents, contentType, fileName);
        }


Behavior

The Grid will correctly load, and allow the user to search, sort, scroll, etc. However upon clicking the Export to Excel button the widget will enter a loading animation and then spin forever.  The rightmost IsSecurityGroup column will also appear to be duplicated, but I think this is a visual glitch as I'm not actually seeing an additional column be created in the page elements, this visual glitch goes away if I add "Scrollable".

My breakpoint in the ExcelExportSave() controller action is not being hit, and if I check the network tab it does not appear that a network request is even being made. 

There are no errors or warnings printed to the browser console.  

Troubleshooting steps I've tried:

  • Changing the controller for the ExcelExportSave action and also making the action [Anonymous]
  • Simplifying the Grid by removing the client-templates, dynamic filename, and custom button.
  • Removed other JS functions from the page (there aren't many, this is a pretty simple page and shouldn't have much conflicting logic)
  • Verified that the ViewModel values are not null and as expected on pageload
  • I have generally tried adjusting some of the Excel configuration options, but none of these seem to alter the behavior.

Kendo otherwise appears to be correctly imported into the project and I am not experiencing other issues.

My Environment and Project

This is an ASP.NET Core 8 MVC project being run in Visual Studio 2022 on a Windows laptop.  The project does use Microsoft Identity authentication and I am developing by running it on Localhost.  

 

Any help that anyone can provide would be greatly appreciated.  

Ivan Danchev
Telerik team
 answered on 27 May 2024
0 answers
28 views

Please delete. Not a bug. 

Hannah
Top achievements
Rank 2
 updated question on 21 May 2024
1 answer
77 views

Here's my grid:

 

@(Html.Kendo().Grid<SalaryIncrease>()
    .Name("SalaryIncreaseGrid")
    .Columns(columns =>
    {
        columns.Command(command =>
                        {
                            command.Custom("Edit").Click("meVM.editSalaryIncrease");
                            command.Custom("Delete").Click("meVM.deleteSalaryIncrease");
                        }).Width(100);
        columns.Bound(p => p.FiscalYear).Title("Fiscal Year").Width(250);
        columns.Bound(p => p.SalaryIncreaseCategory.Name).Title("Salary Increase Category").Width(400);
        columns.Bound(p => p.CurrencyId).Title("Currency").Width(250);
        columns.Bound(p => p.IncreaseAmount).Title("Increase Amount").Width(500).Format("{0:###,##0.00}");
        columns.Bound(p => p.EffectiveDate).Title("Effective Date").Width(500).Format("{0:yyyy-MM-dd}");
    })
    .Pageable(pageable => pageable
    .Refresh(false)
    .PageSizes(new[] { 5, 10, 25, 50, 100 })
    .ButtonCount(6)
    )
    .Sortable()
    .Selectable(selectable => selectable.Mode(GridSelectionMode.Single))
    .Resizable(resize => resize.Columns(true))
    .Scrollable()
    .ColumnMenu(menu => { menu.ComponentType("modern"); })
    .Events(e => e.DataBound("meVM.onSalaryIncreaseGridDataBound"))
    .DataSource(dataSource => dataSource
    .Ajax()
    .Batch(true)
    .PageSize(10)
    .Model(model => model.Id(p => p.Id))
    .ServerOperation(false)
    .Read(read => read.Url("/Employee/ManageEmployee?handler=SalaryIncrease_Read").Type(HttpVerbs.Get))))
What I want to do is pass the id specified in the `.Model` line to the javascript functions `meVM.editSalaryIncrease` and `meVM.deleteSalaryIncrease`. When I look at the documentation it always uses `this.dataItem($(e.currentTarget).closest("tr"))` to find the dataItem and get the Id. The problem is I have javascript classes acting as client-side view models. The functions on those view models are defined as arrow functions so that `this` points to the class and I can call private functions. But if I do that here, then `this` will not contain dataItem. All of this could be resolved if I could just call `meVM.editSalaryIncrease(Id)` to pass the parameter. How can I do this?
Legion
Top achievements
Rank 1
Iron
 answered on 09 May 2024
1 answer
56 views

Hello,

i want to bind data to an autocomplete async.
The index.cshtml looks like this:

@(Html.Kendo().AutoCompleteFor(m => m.customerName)
        .DataTextField("customerName")
        .BindTo((System.Collections.IEnumerable)ViewData["customers"])
    )

The controller like this:

 public async Task<IActionResult> Index()
 {
     InitializeApiClient();

     ViewData["customers"] =  await GetCustomers();

     return View();
 }

 private async Task<IEnumerable<CustomerShort>> GetCustomers()
 {
     Customers = new List<CustomerShort>();

     List<Models.Customer> customer = await JupiterClient.Api.V1.Customer.GetAsync(x => x.QueryParameters = null);
     foreach (var item in customer)
     {
         Customers.Add(new CustomerShort()
         {
             customerId = item.Id.ToString(),
             customerName = item.Name + @" (" + item.Id.ToString() + @")"
         });

         if (Customers.Count > 999)
         {
             break;
         }


     }

     return Customers.AsEnumerable();
 }

When i start the web-app i get no error. But the client-data is empty:
What have i made wrong?

Kind regards
Jens

Anton Mironov
Telerik team
 answered on 08 May 2024
1 answer
67 views

I have a Hierarchy Grid similar to https://demos.telerik.com/aspnet-core/grid/hierarchy

In my child Grid i have used a Client template to add an image which on click calls a JQuery Function. I am passing row from grid in my JQuery function. I can not use Grid function as i need to do some pre and post validation in JQuery before my Controller method is called.

How do i get the Grid Id for child grid to retrieve the row clicked in my JQuery function. 

For the Parent gris i am able to achieve this using:

var tr = $(ev).closet("tr");

var dataItem = $("parentGridName").data("kendoGrid").dataItem(tr);

But for child grid since name is created dynamically how do i retrieve the row clicked.

Mihaela
Telerik team
 answered on 07 May 2024
1 answer
60 views

I have a kendo grid with fields as below:

columns.Bound(p => p.FlightID).Visible(false);
columns.Bound(p => p.FlightDate).Format("{0:d}").Media("(min-width: 450px)");
columns.ForeignKey(p => p.AircraftID, @Model.Aircraft, "AircraftID", "Registration").Title("Aircraft").EditorTemplateName("ComboBox").Media("(min-width: 450px)");
... more columns
columns.Template("#=resColTemplate(data)#").Title("Record").Media("(max-width: 450px)");

And a responsive column template:

<script id="responsive-column-template" type="text/x-kendo-template">
    <p class="col-template-val"><strong>Date: </strong>#=kendo.toString(FlightDate, "dd/MM/yyyy")#</p>
    <p class="col-template-val"><strong>Registration: </strong>#=data.AircraftID#</p>
</script>
Razor PageModel:
public class IndexModel : PageModel
{
    public IndexModel(ApplicationDbContext context)
    {
        _context = context;
    }

   private readonly ApplicationDbContext _context;

   public IEnumerable<Models.Aircraft> Aircraft { get; set; }

   public IEnumerable<Models.Person> Person { get; set; }

   public IEnumerable<Models.Organisation> Organisation { get; set; }

   public async Task OnGet()
   {
       Aircraft = await _context.Aircraft.AsNoTracking().ToListAsync();
       Person = await _context.Person.AsNoTracking().ToListAsync();
       Organisation = await _context.Organisation.AsNoTracking().ToListAsync();
   }
   public async Task<IActionResult> OnPostRead([DataSourceRequest] DataSourceRequest request)
   {
       var flightLogs = await _context.FlightLog.AsNoTracking().ToList().ToDataSourceResultAsync(request);

       return new JsonResult(flightLogs);
   }
....

Instead of the AircraftID field, I would like to display Registration from the ForeignKey field.  Note the ForeignKey field is populated from another model.

Is that possible?

Mihaela
Telerik team
 answered on 01 May 2024
1 answer
45 views

I am trying to create a grid with 4 columns: Field, Operator, Value and a Delete button

The Field column is selectable from a drop down when editing and this I have done using a Action call.

The second column, Operator has a fixed set of operators like '>', '<', '>='. I was hoping to create this list right inside this grid definition. So I chose the overload: columns.ForeignKey(memberName, SelectList) and I have created a SelectList in the second argument. But it does not work and the Operator column is not showing a drop down:

@(
Html.Kendo().Grid<formFilter>()
	.Name("gridFilter")
	.ToolBar(toolbar =>
	{
		toolbar.Create().Text("Add");
		toolbar.Save().Text("Save").CancelText("Cancel");
	})
	.Editable(editable => editable.Mode(GridEditMode.InCell))
	.Columns(columns =>
	{
	columns.ForeignKey(c => c.filterName, ds => ds.Read(r => r.Action("fieldNames", "View1", new { className = "View1" })), "filterName", "filterName").Title("Field").Width(200);
	columns.ForeignKey(c => c.filterEval, new SelectList(
		new List<SelectListItem>
			{
				new SelectListItem { Text = ">", Value = ">"},
				new SelectListItem { Text = "<", Value = "<"},
				new SelectListItem { Text = ">=", Value = ">="},
			}, "Value", "Text"))
		.Title("Operator").Width(200);
	columns.Bound(c => c.filterValue).Title("Value");
	columns.Command(c => c.Destroy()).Width(50);
	})
	.Pageable(pageable => pageable
	.Refresh(true)
	.PageSizes(true))
	.DataSource(dataSource => dataSource
		.Ajax()
		.PageSize(5)
		.Batch(true)
		.ServerOperation(false)
		.Events(events => events.Error("ErrorHandlerForFilterTable"))
		.Model(model =>
		{
			model.Id(p => new { p.filterId });
		})
		.Create("createFilter", "View1")
		.Read(read => read.Action("getFiltersTable", "View1", new { url = @Context.Request.Path }))                                                                                
		.Update("updateFilter", "View1")
		.Destroy(del => del.Action("deleteFilter", "View1"))                                        
	)
)

Alexander
Telerik team
 answered on 30 Apr 2024
1 answer
49 views

Hello,

It is not clear from your documentation whether you are still relying on jszip.js for Excel exports.  We have found that this library has critical security vulnerabilities that have not been addressed by the FOSS developer who created it.

Please advise as to what you recommend.

 

Thanks.

Mihaela
Telerik team
 answered on 29 Apr 2024
1 answer
42 views

Hi,

I have a requirement where backend will send a dataset with multiple datatables as model to UI and I need to display grids for each table of dataset. I am not able to find any solution to use server binding with the datable to the grid.

Any help/suggestions would be appreciated..

Alexander
Telerik team
 answered on 29 Apr 2024
1 answer
34 views
I am using Kendo Multiselect with asp.net core where we have checkboxes . We allow the checkboxes to be multi-selected and unselected by clicking anywhere on label or checkbox. The issue is when a checkbox is selected, I want the focus to stay on the currently checked checkbox wrapped up in a <div> tag, but it's going to the last checked checkbox in the list.
Alexander
Telerik team
 answered on 29 Apr 2024
Narrow your results
Selected tags
Tags
+? more
Top users last month
Peter
Top achievements
Rank 1
Iron
Iron
Iron
Jarne
Top achievements
Rank 2
Iron
Steve
Top achievements
Rank 2
Iron
Iron
Iron
abdul
Top achievements
Rank 1
SUNIL
Top achievements
Rank 2
Iron
Iron
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Peter
Top achievements
Rank 1
Iron
Iron
Iron
Jarne
Top achievements
Rank 2
Iron
Steve
Top achievements
Rank 2
Iron
Iron
Iron
abdul
Top achievements
Rank 1
SUNIL
Top achievements
Rank 2
Iron
Iron
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?