Why are ApiController and Controller's ModelState are so different?

Recently I use ASP.net Web API to build a small project. I met some problems in returning server side model validation messages. Then I built a small test project and created a model like that:

复制代码
    public class Contact : IValidatableObject
    {
        [Required]
        public string FullName { get; set; }

        [RegularExpression(@"^\d[-,\d]*\d$", ErrorMessage = "Phone number is incorrect.")]
        public string PhoneNumber { get; set; }

        [RegularExpression(@"^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$", ErrorMessage = "Email format is incorrect.")]
        public string Email { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (this.Email == null && this.PhoneNumber == null)
                yield return new ValidationResult("Email and phone number can not both be empty.", new string[] { "PhoneNumber", "Email" });
        }
    }
复制代码

I also created two controllers to test it. The Web API controller:

复制代码
    public class ContactController : ApiController
    {
        public HttpResponseMessage Post([FromBody]Contact ct)
        {
             HttpResponseMessage msg = new HttpResponseMessage(HttpStatusCode.OK);
             msg.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(ModelState));
             return msg;
        }
    }
复制代码

The MVC controller:

    public class ContactMvcController : Controller
    {
        [HttpPost]
        public ActionResult Contact(Contact ct)
        {
            return Content(Newtonsoft.Json.JsonConvert.SerializeObject(ModelState));
        }
    }

After that, I use fiddler to post a request to test it:

Http headers ----
content-type: application/json
Content-Length: 28

Http content ----
{"FullName":"Jiang Guogang"}

Then I got very different result. The MVC controller:

Noticing that all properties are contained in result whatever it has error or not. And look at the Web API controller:

That's strange. I want to know the reason why they are so different.

Personally, I think the MVC controller does better.

I also compared the prototype of the two ModelStates. They are little difference althought they are in different namespaces and libraries.

MvcController's ModelState namespace System.Web.Mvc System.Web.Mvc.dll
Web API Controller's ModelState namespace System.Web.Http.ModelBinding System.Web.Http.dll


Does that make sense?

posted @   guogangj  阅读(605)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示