When the Model for the Grid inherits the CustomTypeDescriptor, an error is thrown.
Open the attached sample project -
TelerikAspNetCoreApp3.zip
Load the About page
The following error is thrown:
An unhandled exception occurred while processing the request.
InvalidOperationException: Bound columns require a field or property access expression.
Kendo.Mvc.UI.GridBoundColumn<TModel, TValue>..ctor(Grid grid, Expression<Func<TModel, TValue>> expression)
The view should load without any errors
Can't update Razor.RuntimeCompilation to 5.0.0, because Telerik.UI.for.AspNet.Core (2020.3.1118) uses Microsoft.CodeAnalysis.Common=3.3.1 (needed >=3.7.0).
NU1107: OperationalAccounting -> Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 5.0.0 -> Microsoft.CodeAnalysis.Razor 5.0.0 -> Microsoft.CodeAnalysis.Common (>= 3.7.0) OperationalAccounting -> Telerik.UI.for.AspNet.Core 2020.3.1118 -> Microsoft.CodeAnalysis 3.3.1 -> Microsoft.CodeAnalysis.CSharp.Workspaces 3.3.1 -> Microsoft.CodeAnalysis.Common (= 3.3.1).
When assigning the Name of a Telerik UI control, the value specified is used for both the name and id attributes of HTML elements. If the value specified contains a period (ex. a property of a complex model property, ex. Model.Address.Line1) then the "name" attribute will still contain the period (ex. "Address.Line1") but because periods are invalid for the "id" attribute, the periods should get replaced with an underscore by default (ex. "Address_Line1"). Using HTML helpers, this appears to be happening correctly. Using Tag Helpers, on the other hand, does not appear to be sanitizing the id values and instead leaves the period, causing an invalid value to be used and inconsistent results when compared to the HTML Helpers.
Example using the ListBox component:
// Tag Helper, generates this: <select id="ComplexModelProperty.ListBoxTagHelper" name="ComplexModelProperty.ListBoxTagHelper">
<kendo-listbox name="ComplexModelProperty.ListBoxTagHelper" bind-to="new List<string>()"></kendo-listbox>
// HTML Helper, generates this: <select id="ComplexModelProperty_ListBoxHtmlHelper" name="ComplexModelProperty.ListBoxHtmlHelper">
@(Html.Kendo().ListBox()
.Name("ComplexModelProperty.ListBoxHtmlHelper")
.BindTo(new List<string>())
)
Example using the Button component:
// Tag Helper, generates this: <button id="ComplexModelProperty.ButtonTagHelper" name="ComplexModelProperty.ButtonTagHelper" type="button">
<kendo-button name="ComplexModelProperty.ButtonTagHelper">Image icon</kendo-button>
// HTML Helper, generates this: <button id="ComplexModelProperty_ButtonHtmlHelper" name="ComplexModelProperty.ButtonHtmlHelper" type="button">
@(Html.Kendo().Button()
.Name("ComplexModelProperty.ButtonHtmlHelper")
.HtmlAttributes(new { type = "button" })
.Content("Image icon"))
I only tested with these two components to verify this wasn't an issue specific to the ListBox component, but I'm assuming this is a problem with any component when using Tag Helpers. After looking at some of the relevant code, I'm guessing this could be corrected by updating the GenerateId() method in the TagHelperBase class (ex. by calling something like GenerateIdFromName() that would handle sanitizing the value).
I also found this forum post from over two years ago reporting what appears to be this same issue. There was a reply that acknowledged the issue and offered a workaround "until this issue is fixed", however after two years I would think something like this would have already been fixed (a bug that applies to all Tag Helpers, results in invalid HTML being generated, and can be fixed by using a built-in .NET method that was created specifically for this purpose).
It would be useful to have an exemple of how to uploda directly to an Azure Storage container from a Kendo UI upload or FileManager component.
Hallo Teleirk team
Please add Rotate function to the imageeditor
Thank you
https://demos.telerik.com/aspnet-core/imageeditor/index
Best regards
Murat from Zurich
Since support for cancellation token on user vote:
was declined and is unplanned.
I would like to implement it by myself.
However most of methods used by code is private or internal, so extending current one is difficult to achieve without copying a lot of existing methods and marking them public. It would be good make them part of public api so implementing own extension to ToDataSourceResult and ToTreeDataSourceResult would be possible. Currently it is not.
Kind Regards
Marcin
We want to have a tabstrip that a user can select the tabs that he wants with checkbox. For example:
It will be a great feature.
<div id="tabstrip">
<ul>
<li>@Html.Checkbox("name",false) A </li>
</ul>
</div>
The kendo.common-bootstrap.min.css file contains the following rule:
.k-time-container{padding-right:100px;padding-left:100px;margin-left:-100px;margin-right:-100px;margin-"left":-117px}
that sets margin-left incorrectly: margin-"left"
The Rating is unresponsive.
The Rating works properly.
Currently the components accept only ClientTemplates. From an ASP.NET perspective it is more convenient to store the templates in ~Views\Shared\DisplayTemplates folder.
Please provide a new method TemplateView("ViewName") that will look for the partial in the folders much like we have it for the EditorTemlates.
Hi Telerik Team
We think it might be very useful an component in telerik like this one https://fengyuanchen.github.io/cropperjs/ for rotate, crop, resize, zoom and move. with a picture box like https://ashleydw.github.io/lightbox/#videos-gallery
If you implement this we will very happy
Thank you
kendo.aspnetmvc.js does not account for server aggregates serialized with came case property names like it does for Groups.
Can the following code (minus the comments) be included in a future release to resolve this?
function translateAggregateResults(aggregate) {
var obj = {};
// LSS: support for camel case serialization
obj[(aggregate.AggregateMethodName || aggregate.aggregateMethodName).toLowerCase()] = (aggregate.Value || aggregate.value);
return obj;
}
function translateAggregate(aggregates) {
var functionResult = {}, key, functionName, aggregate;
for (key in aggregates) {
functionResult = {};
aggregate = aggregates[key];
for (functionName in aggregate) {
functionResult[functionName.toLowerCase()] = aggregate[functionName];
}
aggregates[key] = functionResult;
}
return aggregates;
}
function convertAggregates(aggregates) {
var idx, length, aggregate;
var result = {};
for (idx = 0, length = aggregates.length; idx < length; idx++) {
aggregate = aggregates[idx];
// LSS: support for camel case serialization
result[(aggregate.Member || aggregate.member)] = extend(true, result[(aggregate.Member || aggregate.member)], translateAggregateResults(aggregate));
}
return result;
}
extend(true, kendo.data, {
schemas: {
'aspnetmvc-ajax': {
groups: function (data) {
return $.map(this._dataAccessFunction(data), translateGroup);
},
aggregates: function (data) {
data = data.d || data;
// LSS: support for camel case serialization
var aggregates = data.AggregateResults || data.aggregateResults || [];
if (!$.isArray(aggregates)) {
for (var key in aggregates) {
aggregates[key] = convertAggregates(aggregates[key]);
}
return aggregates;
}
return convertAggregates(aggregates);
}
}
}
});
The StringExtensions -> ToCamelCase method(part of Kendo.Mvc.Extenstions) doesn't return the expected Camel case result.
Include the Kendo.Mvc.Extenstions namespace. Define the following in a controller:
public IActionResult Index()
{
string test = "RANDOMStatusId";
test = test.ToCamelCase();
return View();
}
Set a debugger and see the value of the "test" variable.
The returned from the ToCamelCase() method value is "rANDOMStatusId"
The expected result returned from the ToCamelCase() method value is "randomStatusId"
Be able to bind the DataSource to data without a separate controller and AJAX fetch for use with Razor Pages.
The use case is a shared data source that drives multiple components on a page for example a chart and grid filtered with an auto complete box.
In a grid I can do this:
@(Html.Kendo().Grid(Model.Data)
.Name("Grid")
.Columns(columns =>
{
columns.Bound(p => p.Description).Title("Description");
columns.Bound(p => p.RecordCount).Title("Number Sold").Width(130);
columns.Bound(p => p.TotalValue).Title("Total Value").Width(130);
columns.Bound(p => p.AverageValue).Title("Average Value").Width(130);
columns.Bound(p => p.Rank).Title("Rank").Width(130);
columns.Bound(p => p.RankMax).Title("Bananas").Width(130);
columns.Bound(p => p.LowerQuartile).Title("LowerQuartile").Width(130);
columns.Bound(p => p.Median).Title("Median").Width(130);
columns.Bound(p => p.UpperQuartile).Title("UpperQuartile").Width(130);
})
.Sortable()
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(20)
.ServerOperation(false)
)
)
Would want to be able to do same with the DataSource like:
@(Html.Kendo().DataSource(Model.Data)
.Name("dataSource1")
.Ajax(dataSource => dataSource
.ServerOperation(false)
)
)
Validation attributes are not rendered on Kendo editors if ViewData contains same key as the model.
@{
ViewData["Title"] = "Home Page";
}
@using (Html.BeginForm())
{
@Html.Kendo().TextBoxFor(model => model.Title)
}
<script>
$(function () {
$("form").kendoValidator();
});
</script>
Validation attributes are not rendered.
Validation attributes should be rendered on the input element.
I am looking for an extension to the Grid Columns fluent api that adds .Exportable(true or false). Exportable(true) would be the default and indicate that this column does get exported when exporting to Excel (or PDF). Exportable(false) would indicate that the column does NOT get exported.
Imagine the following Grid Definition:
@(Html.Kendo().Grid<Services>
()
.Name("gridMain")
.Columns(columns =>
{
columns.Bound(p => p.ServiceId).ClientTemplateId("rowNumTemplate").Title("Row").Width(50);
//columns.Bound(p => p.ServiceId).ClientTemplateId("cmdsTemplate").Title("Cmds").Width(125).Media("(min-width: 768px)");
columns.Bound(p => p.ServiceCode).Media("(min-width: 768px)");
columns.Bound(p => p.ServiceId).ClientTemplateId("xsTemplate").Title("Service / Desc / Code").Media("(max-width: 768px)");
columns.Bound(p => p.ServiceId).ClientTemplateId("serviceTemplate").Title("Service / Desc").Media("(max-width: 992px) and (min-width: 768px)");
columns.Bound(p => p.ServiceName).Media("(min-width: 992px)");
columns.Bound(p => p.ServiceDescription).Media("(min-width: 992px)");
columns.Bound(p => p.ServiceActive).ClientTemplateId("activeTemplate").Width(60).Media("(min-width: 768px)");
columns.Bound(p => p.ServiceId).ClientTemplateId("btnsTemplate").Title("View/Edit/Del").Width(150);
//columns.Bound(p => p.ServiceId).ClientTemplateId("xsCmdsTemplate").Title("Cmds").Media("(max-width: 768px)");
})
.Scrollable(scrollable => scrollable.Endless(true))
.Pageable(p => p.Numeric(false).PreviousNext(false))
.ToolBar(t => t.Search())
.Search(s => { s.Field(c => c.ServiceCode); s.Field(c => c.ServiceName); s.Field(c => c.ServiceDescription); })
.Resizable(resize => resize.Columns(true))
.ToolBar(t => t.Excel().Text("Excel"))
.Excel(excel => excel
.FileName("ABT_Services.xlsx")
.Filterable(true)
)
.DataSource(dataSource =>
dataSource
.WebApi()
.PageSize(Model.GridPageSize)
.Model(model =>
{
model.Id(p => p.ServiceId);
})
.Events(events => events.Error("errorHandler").RequestEnd("gridMainRequestEnd"))
.Read(read => read.Action("Get", "Services"))
)
)
What I would like to do is define a column like the following:
columns.Bound(p => p.ServiceId).ClientTemplateId("rowNumTemplate").Title("Row").Width(50).Exportable(false);
In the case above, the "Row" column would not be Exported to Excel.
If you take a closer look at the Columns definition above you will see that the configuration is implemented to support responsive page sizing. Because the current implementation of Export to Excel does not allow an Exportable(true/false), I get these columns that I don't want in the exported Excel.
Although there appear to be workarounds (like keeping a second hidden grid -- a poor solution at best), none would be as useful to a Developer as defining an Exportable(true/false) as part of the Column configuration.
Thanks for considering my request.