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 模型验证服务器端的主要内容,如果未能解决你的问题,请参考以下文章
如何在 blazor webassembly 项目中对服务器端控制器中的用户进行身份验证?