我想知道如何用ASP.NET Web API实现模型验证。我的模型是这样的:
public class Enquiry
{
[Key]
public int EnquiryId { get; set; }
[Required]
public DateTime EnquiryDate { get; set; }
[Required]
public string CustomerAccountNumber { get; set; }
[Required]
public string ContactName { get; set; }
}
然后在API控制器中有一个Post操作:
public void Post(Enquiry enquiry)
{
enquiry.EnquiryDate = DateTime.Now;
context.DaybookEnquiries.Add(enquiry);
context.SaveChanges();
}
如何添加
像这样,例如:
public HttpResponseMessage Post(Person person)
{
if (ModelState.IsValid)
{
PersonDB.Add(person);
return Request.CreateResponse(HttpStatusCode.Created, person);
}
else
{
// the code below should probably be refactored into a GetModelErrors
// method on your BaseApiController or something like that
var errors = new List<string>();
foreach (var state in ModelState)
{
foreach (var error in state.Value.Errors)
{
errors.Add(error.ErrorMessage);
}
}
return Request.CreateResponse(HttpStatusCode.Forbidden, errors);
}
}
这将返回如下响应(假设JSON,但XML的基本原理相同):
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
(some headers removed here)
["A value is required.","The field First is required.","Some custom errorm essage."]
当然,您可以以任何方式构造错误对象/列表,例如添加字段名,字段ID等。
即使它是一个“单向”Ajax调用,比如一个新实体的POST,您仍然应该返回一些东西给调用者-一些指示请求是否成功的东西。设想一个站点,您的用户将通过AJAX POST请求添加一些关于自己的信息。如果他们试图输入的信息无效怎么办?他们如何知道他们的保存操作是否成功?
最好的方法是使用好的旧HTTP状态代码,如
下面是一个使用ActionFilter和jQuery的更高级版本的教程:http://asp.net/web-api/videos/getting-started/custom-validation
也许不是你想要的,但也许让人知道是件好事:
如果您正在使用。NET Web API2,则只需执行以下操作:
if (!ModelState.IsValid)
return BadRequest(ModelState);
根据模型错误,您会得到以下结果:
{
Message: "The request is invalid."
ModelState: {
model.PropertyA: [
"The PropertyA field is required."
],
model.PropertyB: [
"The PropertyB field is required."
]
}
}
对于关注点的分离,我建议您使用action filter进行模型验证,这样您就不需要太关心如何在您的api控制器中进行验证:
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace System.Web.Http.Filters
{
public class ValidationActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var modelState = actionContext.ModelState;
if (!modelState.IsValid)
actionContext.Response = actionContext.Request
.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
}
}
}
null null 后端代码有一个枚举,它在代码中赋予这些预定义整数一个含义 web服务API将返回状态号 前端代码有一个类似的枚举,它在代码中赋予这些预定义整数一个含义。(如后端代码) null null 优点: 数据库定义良好并规范化 从API返回的数据是描述性的,并提供了所需的含义。 使用的状态常量已包含其含义,这减少了出错的机会。 对数据库中的列使用枚举类型有其局限性。以后使用ALTER命
出身背景 我们选择Cassandra作为我们的存储引擎,因为我们有一个应用程序,必须处理网站上许多用户之间的异步消息传递和事件存储(某些类型的分析,现场发生的事情以及何时发生等)。此外,我们有一个投票平台,所以我们每天为每个用户存储投票,Cassandra在这些用例中很好。 最近,我们有了在现有系统之上构建关系模型的新需求(至少我们认为它是关系的)。一些类型的政治候选人有工作、教育、历史投票、支持
POJO: 在上面的代码POJO TrackerRefResponse.java前缀responseMessage被设置为responseMessage类型的string或object,所以我们可以用同名的ref变量(java basics:)创建POJO,所以我正在为Referfit中的dynamic寻找相同的解决方案。我知道这在带有异步任务的普通http客户端中非常容易,但这不是REST-AP
我们正在构建一个具有两个流的应用程序: 大量信息流 我们希望连接这两个流以获得共享状态,以便第一个流可以使用第二个状态进行扩展。 每天左右,拼花文件(第二流的源代码)都会更新,这需要我们清除第二流的状态并重建它(可能需要大约2分钟)。 问题是,我们可以在该进程运行时阻止/延迟来自第一流的消息吗? 谢谢。
Apache Beam最近通过和注释引入了状态单元格,并在Apache Flink和Google Cloud Dataflow中提供了部分支持。
我觉得Angular对模型的使用让人困惑。Angular似乎采取的方法是,模型可以是任何你喜欢的--即。Angular不包含显式的模型类,您可以使用常规JavaScript对象作为模型。 “编辑”这个问题的第二个答案很有趣,也很接近我目前使用的。