Telerik MVC - 查看未从Json

时间:2015-11-17 19:42:57

标签: c# json asp.net-mvc telerik

我从Telerik开始并遇到了这个问题。网格被解析到预期的位置:localhost:.../Dashboard/Dashboard不会抛出任何异常,但它是EMPTY。 Json正确地从我的ViewModel中获取数据,并在localhost:.../Dashboard/ChartTable中正确返回。出于某种原因,View不会读取这个Json。我该怎么做呢?

修改

我将Telerik颠倒过来寻找错误,以下建议只是强调了我在控制器中查看的代码是正常的。问题是在一个ViewModel字段中(这里没有在示例代码中提到)我的Json返回NaN - 这在Json中无效。所以我不应该说Json正确地选择了日期。得到这个错误是一个非常好的学习。

查看

@model IEnumerable<PriceBench.ViewModels.CompsSnapshotVM>

<div id="div1">

@(Html.Kendo().Grid(Model)
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(p => p.Name).Width(200).Title("Name");
        columns.Bound(p => p.MatchCount).Width(300).Title("Count");
    })
    .DataSource(dataSource => dataSource
        .Ajax()
        .ServerOperation(false)
        .Read(read => read.Action("ChartTable", "Dashboard"))
        )
)
</div>

控制器:

public ActionResult ChartTable([DataSourceRequest]DataSourceRequest request)
{
    DataSourceResult result = _dashRepo.GetCompsSnapshotVM().ToDataSourceResult(request);

    return Json(result);
}

public ActionResult Dashboard()
{
    return View();
}

3 个答案:

答案 0 :(得分:1)

看起来您正在将网格绑定到View的模型并尝试同时使用AJAX ..只需将网格更改为此。

@(Html.Kendo().Grid<PriceBench.ViewModels.CompsSnapshotVM>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(p => p.Name).Width(200).Title("Name");
        columns.Bound(p => p.MatchCount).Width(300).Title("Count");
    })
    .DataSource(dataSource => dataSource
        .Ajax()
        .ServerOperation(false)
        .Read(read => read.Action("ChartTable", "Dashboard"))
        )
)

它只是告诉网格模型类型是什么。或者在第一次调用视图时传入要绑定网格的数据。

您可能也希望从数据源设置中删除.ServerOperation(false)部分

编辑。

尝试在返回时添加JsonRequestBehavior.AllowGet

public ActionResult ChartTable([DataSourceRequest]DataSourceRequest request)
{
    var result = _dashRepo.GetCompsSnapshotVM().ToDataSourceResult(request);

    return Json(result, JsonRequestBehavior.AllowGet);
}

public ActionResult Dashboard()
{
    return View();
}

答案 1 :(得分:1)

在ASP.NET MVC中使用kendo网格时,我们有两种选择。

  1. AutoBind():如果设置为false,则窗口小部件在初始化期间不会绑定到数据源。在这种情况下,数据绑定将在触发数据源的更改事件时发生。默认情况下,窗口小部件将绑定到配置中指定的数据源。

  2. GetType(HttpVerbs.Get):如果你想在HTTP GET上获取数据。

  3. ServerOperation(bool):启用或禁用服务器操作。
  4. 寻呼机:实施寻呼机
  5. 页面大小:如果实现了寻呼机,则使用页面大小进行分页。
  6. 所以你的网格将是这样的。

    @(Html.Kendo().Grid<PriceBench.ViewModels.CompsSnapshotVM>()
        .Name("grid")
        .AutoBind() //if you are using AutoBind
      //If you want to implement Pager
         .Pageable(pager => pager
                        .PageSizes(true)                    
                        .Info(true)
                        .PreviousNext(true)                    
                    )
        .Columns(columns =>
        {
            columns.Bound(p => p.Name).Width(200).Title("Name");
            columns.Bound(p => p.MatchCount).Width(300).Title("Count");
        })
        .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(10)      
            .ServerOperation(true)
            .Read(read => read.Action("ChartTable", "Dashboard"))            
            )
    )
    

    如果你想使用HTTP GET,它将是这样的。

    .Read(read => read.Action("ChartTable", "Dashboard").Type(HttpVerbs.Get))
    

    我不确定你是如何调用绑定此网格的。如果你能告诉我,我可以根据这个建议你。

    REF

    让我知道它对你有用。

    这个网格对我有用:

    @(Html.Kendo().Grid<UserViewModel>()
        .Name("grid")
        .Columns(columns =>
        {
            columns.Bound(p => p.Username).Width(150).Title("User Name");
            columns.Bound(p => p.Role).Width(100).ClientTemplate("#=Role.RoleName#").Filterable(false).Width(80).Sortable(false);       
        })        
        .Pageable()
        .Sortable()        
        .DataSource(dataSource => dataSource
            .Ajax()               
            .PageSize(10)
            .Model(model =>
            {
                model.Id(p => p.ID);            
                model.Field(p => p.Role).DefaultValue(ViewData["defaultCategory"] as UserRole);
            }
            )
    
    
                    .Read(read => read.Action("GetAllUser", "Administration"))
    
        )
    )
    

答案 2 :(得分:0)

根据编辑,问题是Json在其中一个ViewModel字段中有一个NaN。 Json中不允许使用NaN,它会阻止Telerik正确显示视图。