Параметр, передаваемый в ASP.NET Core Controller с использованием ajax, всегда равен нулю - PullRequest
0 голосов
/ 19 ноября 2018

Я обновляю приложение mvc до .Net Core и испытываю трудности с передачей строкового значения через ajax в контроллер. Я пробовал различные решения, которые нашел в Интернете ([FormBody], префикс = и некоторые другие), но не повезло. Значение всегда равно нулю. Что изменилось в Core, что мне нужно исправить?

      var result = "";

  $.ajax({
      url: "https://......./api/lookups/Search",
      type: "POST",
      data: JSON.stringify(g),
      async: false,
      dataType: "json",
      contentType: 'application/json; charset=utf-8',
      success: function (data) {
       result = data;
    },
    done: function (data) {
       result = data;
    },
       fail: function (data) {
       result = data;
    },
       error: function (jqXHR, textStatus, errorThrown) {
       alert('request failed :' + errorThrown);
    }
});


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Microsoft.AspNetCore.Mvc;

namespace zpmAPI.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class LookupsController : ControllerBase
    {
        private zBestContext db = new zBestContext();

        // GET api/values
        [HttpGet]
        public string sayHello()
        {
            return "hello";
        }

        [HttpPost]
        //[Route("api/Lookups/LocationSearch")]
        public JsonResult LocationSearch(GeneralSearch g)
        {
            return new JsonResult( "hello from LocationSearch");
        }

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Похоже, я имел дело с проблемой Cors, теперь она работает, используя модифицированный код, указанный ниже в Startup.cs и Controller.

Недостатком этого является то, что «Content-Type: 'application / json'" необходимо добавить в заголовок на стороне клиента, чтобы он работал. Я бы предпочел не делать этого, потому что это потребовало бы, чтобы клиенты сделали обновление к своему коду. Все, что я прочитал, говорит о том, что показанные модификации файла Startup.cs должны позволить мне работать без изменения заголовка записи, но приложение, похоже, игнорирует его.

using System.Collections.Generic;
using dbzBest.Models;
using Microsoft.AspNetCore.Mvc;

namespace zpmAPI.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    [Consumes("application/json")]
    public class PropertyController : ControllerBase
    {
        [HttpPost]
        public List<PropertyTile> Search(PropertySearch s)
        {
            try
            {
                List<PropertyTile> tiles = new List<PropertyTile>();
                dbzBest.Data.Properties db = new dbzBest.Data.Properties();
                tiles = db.Search(s);
                return tiles;
            }
            catch (System.Exception ex)
            {
                PropertyTile e = new PropertyTile();
                e.Description = ex.Message;
                List<PropertyTile> error = new List<PropertyTile>();
                error.Add(e);
                return error;
            }
        }
    }
}

В файле Startup.cs

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {

                app.UseHsts();
            }

            /*add this line for CORS*/
            app.UseCors(opt => opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }
}
0 голосов
/ 19 ноября 2018

Ваше действие контроллера (которое, как я предполагаю, настроено на прием POST-запросов)

public string LoadChildrenAccounts(string parentID)

принимает пустую строку в качестве параметра, но вы POST-объект со свойством типастрока ({ "parentID": "12345" }).

Попробуйте изменить data: stringify({ "parentID": "12345" }) на data: JSON.stringify("12345")

...