当前位置: 首页 > 知识库问答 >
问题:

在ASP.NET Web API中处理模型状态验证

龚振
2023-03-14

我想知道如何用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();
}

如何添加 ,然后处理向下传递给用户的错误消息?

共有3个答案

蒋健
2023-03-14

像这样,例如:

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状态代码,如 等。这样,JavaScript就可以使用正确的回调(错误,成功等)正确地处理失败。

下面是一个使用ActionFilter和jQuery的更高级版本的教程:http://asp.net/web-api/videos/getting-started/custom-validation

孟健
2023-03-14

也许不是你想要的,但也许让人知道是件好事:

如果您正在使用。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."
       ]
   }
}
蓝泰平
2023-03-14

对于关注点的分离,我建议您使用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对象作为模型。 “编辑”这个问题的第二个答案很有趣,也很接近我目前使用的。