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