如何将JsonResult返回到Razor Page?

时间:2019-06-03 12:42:20

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

我是ASP.net和Razor Pages的新手。在下面的代码中,我试图用基于State下拉列表的值填充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'在当前上下文”。有办法使它起作用吗?

2 个答案:

答案 0 :(得分:0)

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

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

有关更多信息,请参见here

答案 1 :(得分:0)

有多个问题。

  1. 对于返回json,您需要使用

    之类的return new JsonResult来尝试@poke的建议
    public IActionResult OnGetDistById(int stateid)
    {
        return new JsonResult(new Product { Id = stateid, Name = "Tom" });
    }
    
  2. 对于PageModel中的操作方法,其名称应使用OnGetDistById

  3. 遵循@Prakash的建议。
  4. 对于客户端,其请求网址应为https://localhost:44358/index?handler=distbyid&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?}");
    });