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?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人