Как отправлять данные JSON на контроллер в ASP.NET Основной веб-API?

#asp.net #angular #asp.net-mvc #asp.net-core #asp.net-web-api

#asp.net #angular #asp.net-mvc #asp.net-ядро #asp.net-web-api

Вопрос:

Я хочу отправить данные (PostDateTime, Name, Division) из Angular в контроллер в качестве параметра, но я не смог передать.

Typescript:

 onSubmit(){
this.salesService.postGetData(this.form.value).subscribe(
  (res: any) => {
    console.log(this.form.value);  //I got data here, working fine upto here but cannot post to controller
    this.recData = res;
  },
  err => {
    if (err.status == 400)
      this.toastr.error('Error !!', 'Authentication failed.');
    else
      this.toastr.error('Network error', 'Authentication failed.');
      //this.loadSpinner.hide();
   }
 );
  

Service.ts:

  postGetData(data) {
     return this.http.post(this.BaseURL   'Report/FilterCollectionReport', data);
 }
  

Контроллер:

 [Route("FilterCollectionReport")]
[HttpPost]
public IActionResult CollectionReportFilter(string PostDateTime, string Name, string Division) // tried by adding [FormBody] also but does not work
{
    string iConn = Configuration["ConnectionStrings:IConnection"];

    using (SqlConnection con = new SqlConnection(iConn))
    {
        List<Object> objList = new List<Object>();

        string query = "KK_SP_VIEWSALESENTRY"; // It is SQL procedure takes some parameter/s

        using (SqlCommand cmd = new SqlCommand(query))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name; 
            cmd.Parameters.Add("@PostDateTime", SqlDbType.VarChar).Value = PostDateTime;
            cmd.Parameters.Add("@Division", SqlDbType.VarChar).Value = Division;

            con.Open();
            cmd.Connection = con;

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    objList.Add(new
                                {
                                   Id = reader[0].ToString(),
                                   Name = reader[2].ToString(),
                                   Division = reader[3].ToString(), //...etc
                                });
                }
            }

            con.Close();
        }

        return Ok(objList);
    }
}
  

Он отлично работает в Postman, когда я отправляю данные из параметров, но не работает из body -> raw -> JSON

Класса нет, я работаю с существующей базой данных..

Есть ли что-то, чего мне не хватает, что мне нужно добавить в мой код?

Ответ №1:

Похоже, что вы отправляете данные объекта в теле запроса, поэтому вам нужно создать для него модель и использовать ее в качестве параметра метода контроллера FromBodyAttribute .

 public sealed class DataModel {
    public string PostDateTime {get; set;}

    public string Name {get; set;}

    public string Division {get; set;}
}
  

И используйте это так:

 [Route("FilterCollectionReport")]
[HttpPost]
public IActionResult CollectionReportFilter([FormBody] DataModel model) 
{
    var name = model.Name;
    var division = model.Division;
    var postDateTime = model.PostDateTime
    // Your logic
}