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
相关产品推荐
相关产品推荐

