【问题标题】:MVC4 Model Validation Server Side in API ControllerAPI 控制器中的 MVC4 模型验证服务器端
【发布时间】: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 */ }
  • 这就是我在问题标题中所说的......

标签: jquery asp.net-mvc asp.net-mvc-3 validation asp.net-mvc-4


【解决方案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 时,了解所有验证方法也很有用。
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2022-12-28
  • 1970-01-01
相关资源
最近更新 更多