Как вернуть JsonResult на страницу Razor? - PullRequest
0 голосов
/ 03 июня 2019

Я новичок в ASP.net и Razor Pages.В приведенных ниже кодах я пытаюсь заполнить раскрывающийся список Район значениями, основанными на раскрывающемся списке Штат.Вот что у меня получилось:

Просмотр:

<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 () работает только с классом Controller в MVC, а не с классом Razor PageModel,поэтому выдает ошибку CS0103 «Имя« Json »не существует в текущем контексте».Есть ли способ заставить его работать?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Есть несколько проблем.

  1. Для возврата JSON, вам нужно попробовать предложение от @poke, используя return new JsonResult, как

    public IActionResult OnGetDistById(int stateid)
    {
        return new JsonResult(new Product { Id = stateid, Name = "Tom" });
    }
    
  2. Для метода действия в PageModel его имя должно следовать предложению @Prakash с использованием OnGetDistById

  3. Для стороны клиента его URL-адрес запроса должен быть https://localhost:44358/index?handler=distbyid&stateid=2 с указанием handler и строки запроса stateid

В любом случае, если вы предпочитаете URL-адрес запроса, например /Info/GetDistById/, вам нужно реализовать веб-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?}");
    });
    
0 голосов
/ 03 июня 2019

ASP Страницы имеют обычные OnGet и OnPost методы. Если вам понадобятся дополнительные звонки на ту же страницу через Ajax, вы должны будете следовать соглашениям OnGet* и OnPost*.

В приведенном вами примере вам нужно назвать метод как OnPostDistById, а в Javascript вам нужно указать URL-адрес как "/Info/DistById". Если бы это был HTTP-вызов Get, имя метода было бы OnGetDistById, а URL-адрес остался бы прежним.

См. здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...