剑道 UI HTML 网格'an item with the same key has already been added'



使用Telerik的剑道UI,剑道Mvc版本2016.3.1028.545

我有一个包含html网格的视图,如下所示:

@(Html.Kendo().Grid<TfUserLoginHistoryReturnModel>()
.Name("loginHistoryGrid")
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("LoginHistory_Read", "Administration", new { DateStart = Model.StartDate }))
.Model(model => model.Id(p => p.UserID)
)
)
.Events(events => events.DataBound("onGridDataBound"))
.Columns(columns =>
{
columns.Bound(p => p.FullName).Title("Full Name");
columns.Bound(p => p.Email);
columns.Bound(p => p.CompanyName).Title("Company");
columns.Bound(p => p.UserType).Title("User Type");
columns.Bound(p => p.AcceptedTermsDate).Title("Date Accepted Terms").Format("{0:MM/dd/yyyy}").Width(125);
columns.Bound(p => p.LastSuccessfulLogin).Title("Last Login").Format("{0:MM/dd/yyyy}").Width(125);
columns.Bound(p => p.NumLogins).Title("Number of Logins");
columns.Bound(p => p.TotalTime).Title("Time Logged (minutes)");
})
.Pageable()
.Sortable()
.Scrollable()
.Filterable(f => f.Extra(true)
.Operators(o => o.ForString(s => s.Clear()
.Contains("Contains")
.DoesNotContain("Does not contain")
.IsEqualTo("Is equal to")
.IsNotEqualTo("Is not equal to")
.StartsWith("Starts with")
.EndsWith("Ends with")
.IsEmpty("Is empty")
.IsNotEmpty("Is not empty")
.IsNull("Is null")
.IsNotNull("Is not null "))))
.HtmlAttributes(new { style = "height:500px;" })
)

关联脚本:

function onGridDataBound(e) {
var grid = e.sender;
if (grid.dataSource.total() == 0) {
$(grid).hide();
}
else {
$(grid).show();
}
}
function searchUserGrid(e) {
if ($("#userSearchText").val() == "") {
$("#loginHistoryGrid").data("kendoGrid").dataSource.filter({ field: "UserId", operator: "equals", value: -1 });
} else {
$filter = [{
"logic": "or",
"filters": [
{ field: "FullName", operator: "contains", value: $("#userSearchText").val() },
{ field: "Email", operator: "contains", value: $("#userSearchText").val() },
{ field: "CompanyName", operator: "contains", value: $("#userSearchText").val() }
]
}];
$("#loginHistoryGrid").data("kendoGrid").dataSource.filter($filter);
}
}

这是控制器中该视图的Get:

[HttpGet]
public ActionResult UsageReport(string DateStart)
{
try
{
UserLoginHistoryViewModel m = new UserLoginHistoryViewModel();
//default is yesterday
DateTime sdt = DateTime.Now.Date.AddDays(-1);
if (!string.IsNullOrWhiteSpace(DateStart))
{
DateTime.TryParse(DateStart, out sdt);
}
m.StartDate = sdt;
return View(m);
}
catch (Exception ex)
{
logger.Error("UsageReportGet", ex);
return RedirectToAction("Index", "Administration");
}
}

当我用一个断点运行这个并转到那个页面时,它甚至不会到达控制器中的LoginHistory_Read。当击中网格时,它会出错。以下是错误和堆栈跟踪:

System.ArgumentException未由用户代码处理
HResult=-2147028409消息=具有相同键的项已经已添加。Source=mscorlib StackTrace:位于System.ThrowHelper.ThrowArgumentException(ExceptionResource资源)在System.Collections.Generic.Dictionary'2.插入(TKey键、T值、布尔加法)位于System.Web.Routing.RouteValueDictionary.Add(字符串键,对象值)位于Kendo.Mvc.UI.GridBoundColumn'2.CreateHeaderBuilderCore()位于Kendo.Mvc.UI.GridColumnBase'1.CreateHeaderBuilder()在Kendo.Mvc.UI.Html.GridCellBuilderFactory.CreateHeaderCellBuilder(IGridColumn列)位于System.Linq.Enumerable.WhereSelectEnumerableIterator'2.MoveNext()位于Kendo.Mvc.UI.Html.GridRowBuilder.CreateRow()位于Kendo.Mvc.UI.Html.GridHeaderRowBuilder.CreateRow()位于Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()位于Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()位于Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()位于Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()位于Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()位于Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()位于Kendo.Mvc.UI.Html.GridRowBuilderDecoratorBase.CreateRow()位于Kendo.Mvc.UI.Html.GridDataSection Builder.CreateHeader(GridRenderingData数据)位于Kendo.Mvc.UI.Html.GridScrollingHtmlBuilder.CreateHeader(GridRenderingDatarenderingData)在Kendo.Mvc.UI.Html.GridScrollingHtmlBuilder.AppendData(IHtmlNodediv,网格渲染数据渲染数据)在Kendo.Mvc.UI.Html.GridHtmlBuilder.CreateGrid(IDictionary'2 htmlAttributes,GridFunctionalData functionalData,GridRenderingDatarenderingData)在Kendo.Mvc.UI.Grid'1.WriteHtml(HtmlTextWriter编写器)在剑道.Mvc.UI.WidgetBase.ToHtmlString()在剑道.Mvc.UI.Fluent.WidgetBuilderBase'2.ToHtmlString()位于System.Web.HttpUtility.HtmlEncode(对象值)位于System.Web.WebPages.WebPageBase.Write(对象值)在ASP_中的Page_Views_Administration_UsageReport_cshtml.Execute()C: \Users\tsimpson\Source\Workspaces\CustomerPortal\CConnect\CConnect\Views\Administration\UsageReport.cs.html:line42位于System.Web.WebPages.WebPageBase.ExecutePageHierarchy()位于System.Web.Mvc.WebViewPage.ExecutePageHierarchy()位于System.Web.WebPages.StartPage.RunPage()位于System.Web.WebPages.StartPage.ExecutePageHierarchy()位于System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContextpageContext,TextWriter编写器,WebPageRenderingBase startPage)位于System.Web.Mvc.RazorView.RenderView(ViewContext视图上下文,TextWriter编写器,对象实例)位于System.Web.Mvc.BuildManagerCompiledView.RRender(ViewContext-ViewContext,TextWriter编写器)位于System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext上下文)位于System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContextcontrollerContext,ActionResult ActionResult)位于System.Web.Mvc.ControllerActionInvoker.IInvokeActionResultFilterRecursive(IList'1filters,Int32 filterIndex,ResultExecutingContext preContext,ControllerContext ControllerContext,ActionResult ActionResult)位于System.Web.Mvc.ControllerActionInvoker.IInvokeActionResultFilterRecursive(IList'1filters,Int32 filterIndex,ResultExecutingContext preContext,ControllerContext ControllerContext,ActionResult ActionResult)
InnerException:

因此,如果我在没有断点的情况下运行它,页面将加载,但网格是空的。

在这一点上,我不知道如何知道它试图在字典中添加什么。我把它和我网站上其他有效的网格进行了比较,不知道是什么导致了这个问题。

这是我制作的一个视频,展示了它的样子,这样你就可以准确地看到错误出现的时间点——希望这会有所帮助。请务必将其设置为1080p!剑道网格错误

让我知道还需要什么其他信息来尝试确定它可能是什么。谢谢!

因此,尽管我不完全理解为什么这不起作用,但我通过重新设计网格获取数据的方式来解决问题。我没有设置网格的DataSource属性并使用Read函数,而是指定网格的模型,如下所示:@(Html.Kendo().Grid(Model.LoginHistorys)我添加了"登录历史"作为我的视图所使用的模型的属性。所以在Get函数中,我只是设置了类似于Read函数的属性。

在我的例子中,我的MODEL有两个名称相似的属性:

public int? corporateId { get; set; }
public int? CorporateId { get; set; }

一个是CamelCase,另一个不是。

解决方案只是删除一个或更改其中一个的名称:

//public int? corporateId { get; set; }
public int? corporate_id { get; set; }
public int? CorporateId { get; set; }

相关内容

最新更新