API 控制器中的 MVC4 模型验证服务器端

Posted

技术标签:

【中文标题】API 控制器中的 MVC4 模型验证服务器端【英文标题】:MVC4 Model Validation Server Side in API Controller 【发布时间】:2013-09-06 11:16:01 【问题描述】:

我有一个管理视图,部分视图是一些用于注册新用户的文本框。我使用 RegisterModel 类作为我的视图模型的一部分,以便获得所有客户端验证,但我正在停止使用 jquery 提交表单,使用 jquery 确认验证客户端,然后将模型发送到 API 控制器ajax。

这是我的 RegisterModel 的精简版。

[Required(ErrorMessage = "User Name Required")]
public string UserName  get; set; 
[Required(ErrorMessage = "Email Required")]
[RegularExpression("REGEX", ErrorMessage = "Invalid Email")]
public string Email  get; set; 
[Required(ErrorMessage = "Password Required")]
public string Password  get; set; 
[Compare("Password", ErrorMessage = "Passwords do not match")]
public string ConfirmPassword  get; set; 

这是我的 API 控制器中注册方法的开始:

[HttpPost]
public void Register (RegisterModel newUser)

   // Validate User


如何利用我的所有数据注释并在我的 API 控制器中验证我的模型?类似 newUser.Validate();

【问题讨论】:

你问的是服务器端验证吗? 如果您谈论客户端,请确保您在 web.config 中启用了不显眼的验证,当您尝试提交表单时,该过程将自动进行。如果您谈论服务器端使用if (Model.IsValid) /* Save */ else /* return view with model */ 这就是我在问题标题中所说的...... 【参考方案1】:

你可以使用

if (ModelState.IsValid) 

在动作中验证模型。

即;

[HttpPost]
public void Register (RegisterModel newUser)

     if (ModelState.IsValid) 
     //process form data

      


【讨论】:

啊,太简单了!出于某种原因,我不认为 ModelSate.IsValid 可以在 API 控制器中工作,所以我再一次完全把事情复杂化了。谢谢!【参考方案2】:

好的,所以如果你想验证服务器端,你必须这样做:

[HttpPost]
public void Register (RegisterModel newUser)

   if (ModelState.IsValid)
   
      // Model valid, can save
      /* Save and redirect */
   
   else
   
      // Model not valid returned by ASP.Net and Entity Framework
      return View(newUser); // return view including current model with errors
   


注意:

当您调用 ModelState.IsValid 时,这将强制您的模型进行验证。模型的验证意味着 ASP.Net 将验证您的 .Net 数据注释,Entity Framework 将验证您的 Entity Framework 数据注释,而 Entity Framework 将验证您的自定义业务逻辑。

ModelState.IsValid 是您可以信任的属性,用于在保存之前验证您的数据,它将处理所有未在客户端进行的验证(因为不支持或禁用 javascript)。

【讨论】:

另外,作为一个完整而简单的例子,创建一个新的 MVC 3 项目,并且控制器中的所有验证逻辑都已经存在并且正在运行。 @RyanJMcGowan:当然,感谢您发现这一点 :) 对于生成的逻辑,他不需要创建一个新项目,而是一个新的控制器,例如使用实体框架的 CRUD 模板。使用 EF 时,了解所有验证方法也很有用。

以上是关于API 控制器中的 MVC4 模型验证服务器端的主要内容,如果未能解决你的问题,请参考以下文章

MVC4 不显眼的验证不等待远程验证完成

如何在 blazor webassembly 项目中对服务器端控制器中的用户进行身份验证?

断开客户端与服务器端信号器的连接

用于客户端交互的 web api 或控制器

我如何在服务器端存储不记名令牌以及验证如何在 Web API 2 中注销时删除?

使用父模型值的子模型验证。流畅的验证。 MVC4