【问题标题】:How to return a JsonResult to Razor Page?如何将 JsonResult 返回到 Razor 页面?
【发布时间】:2026-01-03 18:05:03
【问题描述】:

我是 ASP.net 和 Razor Pages 的新手。在下面的代码中,我尝试使用基于州下拉列表的值填充 District 下拉列表。到目前为止,这是我所得到的:

查看:

<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
<script language="javascirpt" type="text/javascript">
    function GetDist(_stateId) {
        var procemessage = "<option value='0'> Please wait...</option>";
        $("#select-state").html(procemessage).show();
        var url = "/Info/GetDistById/";

        $.ajax({
            url: url,
            data: { stateid: _stateId },
            cache: false,
            type: "POST",
            success: function (data) {
                var markup = "<option value='0'>Quận/Huyện</option>";
                for (var x = 0; x < data.length; x++) {
                    markup += "<option value=" + data[x].Value + ">" + data[x].Text + "</option>";
                }
                $("#select-state").html(markup).show();
            },
            error: function (reponse) {
                alert("error : " + reponse);
            }
        });

    }
</script>

<div class="col-md-offset-0 col-md-2">
            <select class="form-control" id="select-state" onchange = "javascript:GetDist(this.value);">
                @foreach (var state in Model.tbState)
                {
                    <option value=@state.StateId>@state.Statename</option>
                }
            </select>
        </div>
        <div class="col-md-1 ">Quận/Huyện: </div>
        <div class="col-md-offset-0 col-md-2">
            <select class="form-control" id="select-dist">
                @foreach (var dist in Model.tbDistrict)
                {
                    <option value=@dist.DistrictId>@dist.Districtname</option>
                }
            </select>
        </div>

在我的 cshtml.cs 文件中,我有这段代码。我确实在代码开头使用了System.Web.Helpers

public IActionResult GetDistById(int stateid)
        {
            List<TbDistrict> list = new List<TbDistrict>();
            foreach (var q in tbDistrict)
            {
                if (q.StateId == stateid)
                    list.Add(q);
            }
            SelectList selectlist = new SelectList(list, "", "", 0);
            JsonResult result = Json(selectlist);
            return result;
        }

我发现 Json() 方法仅适用于 MVC 中的 Controller 类,而不适用于 Razor PageModel 类,因此它会给出错误 CS0103“名称 'Json' 在当前上下文中不存在” .有没有办法让它工作?

【问题讨论】:

  • 在 Razor 页面上下文中返回非视图有点奇怪(因为关于 Razor 页面的全部意义在于使其非常以视图为中心)。您可以使用return new JsonResult(…) 新建一个JsonResult
  • 如果您需要返回 JSON,那么您应该使用传统的控制器和操作,而不是 Razor 页面。 Razor 页面旨在返回视图。

标签: javascript asp.net ajax asp.net-core razor


【解决方案1】:

ASP Pages 有常用的OnGetOnPost 方法。如果您需要通过 Ajax 对同一页面进行任何其他调用,则必须遵循 OnGet*OnPost* 约定。

在您给出的示例中,您需要将方法命名为OnPostDistById,并且在Javascript 中您需要将URL 命名为"/Info/DistById"。如果这是一个 HTTP Get 调用,方法名称将是 OnGetDistById,并且 URL 将保持不变。

请参阅here 了解更多信息。

【讨论】:

    【解决方案2】:

    有多个问题。

    1. 对于返回 json,您需要尝试使用 @poke 的建议,使用 return new JsonResult like

      public IActionResult OnGetDistById(int stateid)
      {
          return new JsonResult(new Product { Id = stateid, Name = "Tom" });
      }
      
    2. PageModel中的action方法,其名称应遵循@Prakash的建议,使用OnGetDistById

    3. 对于客户端,其请求 URL 应为 https://localhost:44358/index?handler=distbyid&amp;stateid=2,并指定 handler 和查询字符串 stateid

    无论如何,如果您更喜欢/Info/GetDistById/ 之类的请求 url,则需要在您的 razor 项目中实现 web api 而不是 PageModel

    你可以关注:

    1. 在你的项目中添加ValuesController

      [Route("api/[controller]")]
      public class ValuesController : Controller
      {
              // GET: api/<controller>
              [HttpGet]
              public IEnumerable<string> Get()
              {
              return new string[] { "value1", "value2" };
              }        
      }
      
    2. Startup.cs配置路由

      app.UseMvc(routes =>
      {
              routes.MapRoute(
                      name: "default",
                      template: "{controller=Home}/{action=Index}/{id?}");
      });
      

    【讨论】:

      最近更新 更多