You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Razor Pages中Telerik Grid绑定存储过程异常:无数据+Json报错

问题修复方案

1. 解决“Json在当前上下文不存在”错误

  • ASP.NET Core Razor Pages中,JSON返回逻辑需放在PageModel类中,不能单独写在无类包裹的文件里。
  • 移除过时的JsonRequestBehavior.AllowGet,ASP.NET Core默认允许GET请求返回JSON。
  • 通过依赖注入IConfiguration获取数据库连接字符串,替代未定义的GetSQLServerConnectionString()方法。

修改后的TestGridModel.cs:

using Microsoft.AspNetCore.Mvc;
using System.Data;
using System.Data.SqlClient;
using CountyBillingSystemProj.CommonControls;
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using Microsoft.Extensions.Configuration;

namespace CountyBillingSystemProj.Pages.TEMP
{
    public class TestGridModel : PageModel
    {
        private readonly IConfiguration _configuration;

        public TestGridModel(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        public IActionResult OnGetRetrieveUserRecord([DataSourceRequest] DataSourceRequest request)
        {
            string connectionString = _configuration.GetConnectionString("YourDBConnection");

            using (SqlConnection sqlConn = new SqlConnection(connectionString))
            using (SqlCommand cmd = new SqlCommand("sp_GetAllUsers", sqlConn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                SqlDataAdapter sd = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();

                sqlConn.Open();
                sd.Fill(dt);
                sqlConn.Close();

                List<UserFields> userFields = new List<UserFields>();
                foreach (DataRow dr in dt.Rows)
                {
                    userFields.Add(new UserFields
                    {
                        ID = Convert.ToInt32(dr["EmpID"]),
                        PersonRequested = dr["PersonRequested"].ToString(),
                        UserID = dr["UserID"].ToString(),
                        LoginID = dr["LoginID"].ToString(),
                        FirstName = dr["FirstName"].ToString(),
                        LastName = dr["LastName"].ToString(),
                        Telephone = dr["Telephone"].ToString(),
                        Email = dr["Email"].ToString()
                    });
                }

                DataSourceResult response = userFields.ToDataSourceResult(request);
                return new JsonResult(response);
            }
        }
    }
}

2. 修正Telerik Grid的数据源配置

Razor Pages需指向页面的处理方法,而非MVC Action,同时修复重复绑定的列:

@page
@model CountyBillingSystemProj.Pages.TEMP.TestGridModel

@(Html.Kendo().Grid<CountyBillingSystemProj.CommonControls.UserFields>()
        .Name("grid")
        .Columns(columns =>
        {
            columns.Bound(c => c.ID);
            columns.Bound(c => c.PersonRequested);
            columns.Bound(c => c.UserID);
            columns.Bound(c => c.LoginID);
            columns.Bound(c => c.FirstName).Width(50);
            columns.Bound(c => c.LastName).Width(50); <!-- 替换重复的FirstName列 -->
            columns.Bound(c => c.Email).Width(150);
            columns.Bound(c => c.Telephone).Width(50);
        })
        .HtmlAttributes(new {style = "height: 550px;" })
        .Scrollable()
        .Groupable()
        .Sortable()
        .Pageable()
        .DataSource(dataSource => dataSource
            .Ajax()
            .Read(read => read.PageHandler("RetrieveUserRecord").Url("/TEMP/TestGrid")) <!-- 指向页面处理方法 -->
            .PageSize(20)
        )
)

3. 基础配置验证

  • 在appsettings.json中添加正确的数据库连接字符串:
    "ConnectionStrings": {
      "YourDBConnection": "Server=你的服务器地址;Database=你的数据库名;Trusted_Connection=True;TrustServerCertificate=True;"
    }
    
  • 在SSMS中执行sp_GetAllUsers存储过程,确认能正常返回数据,且列名(如EmpID)与代码中引用的完全一致。

4. 调试排查

  • 在OnGetRetrieveUserRecord方法中加断点,确认方法是否被调用、userFields是否加载到数据。
  • 打开浏览器开发者工具(F12),查看Network标签下的Ajax请求,检查请求URL是否正确、返回的JSON数据是否有效。

内容的提问来源于stack exchange,提问作者user21872512

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:00:58