(. NET Core Api) В чем разница между передачей объекта и передачей параметра в действие? - PullRequest
1 голос
/ 03 мая 2020

У меня есть . NET Базовый веб-API с функциями crud

, когда я передаю объект типа (Product obj) как json сериализации в действие, его значение приходит к действие хорошо , как вы можете видеть здесь ...

Но, когда я передаю такой параметр, как (int id) как json сериализация, значение не поступает в действие как вы можете видеть здесь

, единственный способ - передать параметр как Строка запроса как ?id=5, в этом случае значение поступает в действие , как вы можно посмотреть здесь

Теперь мне нужно передать параметр как json, так что ...

В чем разница между этими двумя случаями (json и строка запроса) ??

Как передать параметр как json, а не как строку запроса ??


это код контроллера

  private readonly IProductRep rep;

    public ProductController(IProductRep rep)
    {
        this.rep = rep;
    }


    [EnableCors("allow")]
    [HttpPost]

    public IActionResult GetAllProducts()
    {
        try
        {
            return Json(new { Result = "OK", Records = rep.GetAllProducts() });
        }
        catch (Exception ex)
        {

            return Json(new { Result = "ERROR", Message = ex.Message });
        }

    }


    [EnableCors("allow")]
    [HttpPost]

    public JsonResult AddNewProduct(Product obj)
    {
        try
        {
            if (!ModelState.IsValid)
            {
                return Json(new { Result = "ERROR", Message = "Form is not valid! Please correct it and try again." });
            }

            Product product = rep.AddNewProduct(obj);
           return Json(new { Result = "OK", Record = product });
        }
        catch (Exception ex)
        {

            return Json(new { Result = "ERROR", Message = ex.Message });
        }

    }


    [EnableCors("allow")]
    [HttpPost]

    public JsonResult GetProductById(int id)
    {
        try
        {
            return Json( new { Result = "OK", Records = rep.GetProductById(id) });
        }
        catch (Exception ex)
        {

            return Json(new { Result = "ERROR", Message = ex.Message });
        }

    }



    [EnableCors("allow")]
    [HttpPost]  
    public IActionResult DeleteProduct(int id)
    {
        try
        {
            rep.DeleteProduct(id);
            return Json( new { Result = "OK" });
        }
        catch (Exception ex)
        {

            return Json(new { Result = "ERROR", Message = ex.Message });
        }

    }



    [EnableCors("allow")]
    [HttpPost]

    public JsonResult EditProduct(Product obj)
    {

        try
        {
            return Json( new { Result = "OK", Records = rep.EditProduct(obj) });
        }
        catch (Exception ex)
        {
            return Json(new { Result = "ERROR", Message = ex.Message });
        }


    }

Это мой клиент код (я использую jtable)

   $('#container').jtable({
        title: 'Table of people',
        actions: {
            listAction:'http://localhost:62881/product/GetAllProducts',
            createAction:'http://localhost:62881/product/AddNewProduct',
            updateAction: 'http://localhost:62881/product/EditProduct',
            deleteAction:  'http://localhost:62881/product/DeleteProduct'
        },
        fields: {

            Id: {
                key: true,
                create:false,
                edit:false,
                list: true

            },
            ProductName: {
                title: 'Name',
                width: '40%'
            },
            Price: {
                title: 'Price',
                width: '20%'
            },
            ProductCode: {
                title: 'Product Code',
                width: '30%'
            }

        }


    });
    $('#container').jtable('load');

это то, что случилось с почтальоном при попытке отправить идентификатор как json

, но когда я добавляю id как Параметр в маршрутизации и отправить его в виде строки запроса, он работает , как вы можете увидеть здесь

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

В c# int является примитивным типом данных (хранится в стеке, а не в куче) и не является объектом. Следовательно, JsonSeriallizer не может сериализовать ваш идентификатор, если он только int. Прочитайте об этом здесь: https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

Хотя, если вы хотите передать идентификатор как json, а не как строку запроса, вы можете заключить этот идентификатор в класс и сериализовать этот объект и может пройти через это. см. пример ниже.

[Route("api/[controller]")]
public class PersonController : Controller
{
    public string Get([FromQuery] GetPersonQueryObject request)
    {
        // Your code goes here
    }
}

public class GetPersonQueryObject 
{
    public int? Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Address { get; set; }
}

Я хотел бы предложить, если вам просто нужно получить данные из API, тогда следует использовать вызов GET http. Кроме того, GET менее безопасен по сравнению с POST, поскольку отправляемые данные являются частью URL, а данные видны всем в URL.

0 голосов
/ 03 мая 2020

Для первого вызова вы можете сделать что-то вроде этого:

publi c JsonResult AddNewProduct ([FromBody] Product obj)

Я думаю, вы можете добавить такой атрибут

[HttpGet ("api / GetProductById / {id}")] publi c JsonResult GetProductById (int id)

таким образом, вам не нужно совершать вызов, подобный? Id = 5

Надеюсь, это поможет ...

...