Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WebApi(post)向AngularJs返回多个值_C#_Angularjs_Asp.net Web Api - Fatal编程技术网

C# 从WebApi(post)向AngularJs返回多个值

C# 从WebApi(post)向AngularJs返回多个值,c#,angularjs,asp.net-web-api,C#,Angularjs,Asp.net Web Api,我正在使用.NETCoreC#,WebApi和AngularJs 为了保存数据,我的Angularjs代码对我的WebApi进行$http调用。我可以从api返回单个数据,但不确定返回多个值的最佳方法是什么。我可以用逗号分隔,然后返回,但我想知道是否有更好的方法 因此,基本上,当API将数据保存到数据库时,如果保存成功,我希望返回一个变量布尔值,如果保存不成功,则返回一条异常消息。下面是我的代码 AngularJs代码: service.saveData(data).then(function

我正在使用.NETCoreC#,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;
}
[HttpPost(“数据/保存”)]
公共异步任务保存数据([FromBody]列表数据)
{
bool dataSaved=true;
string someDataToReturn=string.Empty;
//执行一些处理和更新someDataToReturn此处
//将数据保存到数据库
数据保存=保存数据(数据);
//我想返回一些datastorereturn、dataSaved(true或false)和SaveData引发的异常(如果有)
返回Ok(someDataToReturn);
}
//DB调用以保存数据
公共bool SaveData(列表数据)
{           
尝试
{
foreach(数据中设置的变量)
{
//创建查询等
_执行(查询);
}                
返回true;
}
catch(SqlException-ex)
{
}
返回false;
}

让我知道最好的方法。

您可以使用
Controller
类方法
Json(对象数据)
。比如:

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)
{
    return this.Json(SaveData(data));
}
[HttpPost(“数据/保存”)]
公共异步任务保存数据([FromBody]列表数据)
{
返回this.Json(SaveData(data));
}

请参阅。

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

看一看。 可以使用注释指定模型中需要的属性,如最小和最大长度等

下面是一个关于如何定义UserData类上需要的Name属性的示例

public class UserData
{
    [Required]  
    public string Name { get; set; }        
}
如果请求模型不满足UserData类DataAnnotations上设置的指定规则,则context 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
    ...
[HttpPost(“数据/保存”)]
公共异步任务保存数据([FromBody]列表数据)
{
如果(!ModelState.IsValid)
return BadRequest(ModelState);//将返回400代码
...
然后是关于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);
    }                
}
[HttpPost(“数据/保存”)]
公共异步任务保存数据([FromBody]列表数据)
{
如果(!ModelState.IsValid)
返回BadRequest(ModelState);//400状态代码
尝试
{
保存数据(数据);
}
捕获(例外e)
{
返回InternalServerError(e);//500状态代码
}
string someDataToReturn=string.Empty;
返回Ok(someDataToReturn);//200状态码
}
公共void SaveData(列表数据)
{           
foreach(数据中设置的变量)
{
//创建查询等
_执行(查询);
}                
}

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

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

return Ok( new { result = dataSaved , error= exception.Message});
标准方式是:
返回201状态代码

[HttpPost(“数据/保存”)]
公共异步任务保存数据([FromBody]列表数据)
{
尝试
{
如果(!ModelState.IsValid)
返回请求(ModelState);
//如果成功创建资源,则返回201的响应
//通常会将此文件连同uri返回给新资源
创建的返回(“位置”,保存数据(数据));
}
捕获(例外)
{
返回InternalServerError();
}
}

为什么要返回
true
false
?如果保存成功,请返回
someDataToReturn
。另一个,返回HTTP错误代码和抛出的异常。@Macus,谢谢,这很有效。虽然我使用的是状态Ok,它工作正常,但没有什么比它给我的内部服务器错误返回代码更好的了。@Macus,谢谢错误:这在当前上下文中不存在。是否有替代品。我正在使用.net core 2.0 c#。状态正常,BadRequest等是Microsoft.AspNetCore.Mvc ControllerBase类的一部分。我可能错过了,但在这个类中找不到与InternalServerError等效的内容。@aman太好了!下面是如何返回500个core。一个最后一个问题。使用上面的API,我可能会发送另一个基本上是布尔值true或false的参数。如果为true,这意味着用户没有在数据参数中发送任何用户数据,这里我需要更新数据库中的标志。现在,上面的问题是,由于数据参数为null,model.isvalid变为fall。我认为这不是一个好方法方法,但目前这是我可能需要处理的。是否有解决方法。我当然可以检查数据是否为null,然后执行ModelStatis.IsValid,但这可能会破坏它的目的。@阿曼听起来更像是你应该为该逻辑创建一个新的enpoint。如果该方法有多个职责,那么你很可能应该把它打碎
    [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();
        }
    }