从WebApi(post)返回多个值到AngularJs

时间:2018-08-14 13:46:46

标签: c# angularjs asp.net-web-api

我正在使用.net core C#,WebApi和AngularJs。

为保存数据,我的Angularjs代码对WebApi进行了$ http调用。我可以很好地从api返回单个数据,但是不确定在这里返回多个值的最佳方法是什么。我可以将其用逗号分隔,然后再返回,但想知道是否有更好的方法。

因此,基本上,当API将数据保存到我的数据库时,我想返回一个变量,布尔值(如果保存成功)以及异常消息(如果保存不成功)。下面是我的代码。

AngularJs代码:

service.saveData(data).then(function (res) {                          
    //get someDataToReturn, dataSaved & exception raised if any from db save here.
    }, function (err) {
});

WebApi代码:

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)
{
    bool dataSaved = true;
    string someDataToReturn = string.Empty;
    //do some processing and updating someDataToReturn here         

    //Saving data to DB
    dataSaved = SaveData(data);                

    //I want to return someDataToReturn, dataSaved(true or false) and exception raised from SaveData if any 
    return Ok(someDataToReturn);
}

//DB Call to save data
public bool SaveData(List<UserData> data)
{           
    try
    {
        foreach (var set in data)
        {
            //creating query etc

            _db.Execute(query);
        }                

        return true;
    }
    catch (SqlException ex)
    {

    }
    return false;
}

让我知道最好的方法。

4 个答案:

答案 0 :(得分:1)

首先,您应该检查请求正文中的值是否正确填充。

看看DataAnnotations。 您可以使用注释来指定模型中哪些属性是必需的,最小和最大长度等。

这是一个有关如何定义UserData类所需的Name属性的示例

public class UserData
{
    [Required]  
    public string Name { get; set; }        
}

如果请求模型不满足UserData类DataAnnotations上设置的指定规则,则上下文ModelState将设置为false并包含DataAnnotations错误。 可以用来确定当前请求是否为错误请求,并从中返回正确的http状态代码。

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState); //will return a 400 code
    ...

然后关于SaveData方法。在控制器中捕获异常并从那里返回正确的状态代码

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState); //400 status code

    try
    {
        SaveData(data);
    }
    catch(Exception e)
    {
        return InternalServerError(e); //500 status code
    }

    string someDataToReturn = string.Empty;
    return Ok(someDataToReturn ); //200 status code
}

public void SaveData(List<UserData> data)
{           
    foreach (var set in data)
    {
        //creating query etc

       _db.Execute(query);
    }                
}

答案 1 :(得分:0)

您可以使用Controller类方法Json(object data)。像这样:

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)
{
    return this.Json(SaveData(data));
}

请参见this

答案 2 :(得分:0)

您可以创建一个实体并将其返回

public class BaseResult{
     public bool Result{get;set;}
     public string Errors{get;set;}
}

或仅

return Ok( new { result = dataSaved , error= exception.Message});

答案 3 :(得分:0)

标准方法是:
    返回201状态码
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201

    [HttpPost("data/save")]
    public async Task<IHttpActionResult> SaveData([FromBody] List<UserData> data)
    {
        try
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState); 

            // return response of 201 if you created the resource successfully
            // typically return this with a uri to the new resource
            return Created("location", saveData(data));
        }
        catch (Exception)
        {
            return InternalServerError();
        }
    }