ASP.NET MVC5验证系列之服务端验证
程序员文章站
2023-11-27 09:25:34
这篇文章,我将会说到,使用数据注解api来进行服务端验证。asp.net mvc 框架在执行的时候,验证所有传递到控制器的数据,如果验证失败就把错误消息,填充到...
这篇文章,我将会说到,使用数据注解api来进行服务端验证。asp.net mvc 框架在执行的时候,验证所有传递到控制器的数据,如果验证失败就把错误消息,填充到modelstate对象中,并且把这个对象传递给控制器,然后控制器中的方法,根据modelstate的状态来判断,是否验证失败还是验证通过。
在这里,我将会使用两种方法来验证数据的合法性,一个是手动添加错误消息到modelstate对象中,另外一个方法是使用数据注解【data annotation】 api,来做。
先来看看使用手动验证的方式吧:
我们新建一个空白的mvc项目:添加一个student实体:
using system; using system.collections.generic; using system.linq; using system.web; namespace server_side_validation_in_mvc.models { public class student { public string name { get; set; } public string email { get; set; } } }
然后添加一个student控制器:
using server_side_validation_in_mvc.models; using system; using system.collections.generic; using system.linq; using system.text.regularexpressions; using system.web; using system.web.mvc; namespace server_side_validation_in_mvc.controllers { public class studentcontroller : controller { // get: student public actionresult index() { return view(); } [httppost] public actionresult index(student model) { //服务端验证,方法一,手动添加错误消息到modelstate对象中 //如果name是空的 if (string.isnullorempty(model.name)) { modelstate.addmodelerror("name", "name is required"); } //如果email是空的 if (string.isnullorempty(model.email)) { modelstate.addmodelerror("email", "email is required"); } else { string emailregex = @"^([a-za-z0-9_\-\.]+)@((\[[0-9]{1,3}" + @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-za-z0-9\-]+\" + @".)+))([a-za-z]{2,4}|[0-9]{1,3})(\]?)$"; regex re = new regex(emailregex); //email不为空的时候,但格式不合法 if (!re.ismatch(model.email)) { modelstate.addmodelerror("email", "email is not valid"); } } //实体验证通过 if (modelstate.isvalid) { viewbag.name = model.name; viewbag.email = model.email; } return view(model); } } }
创建index视图:
@model server_side_validation_in_mvc.models.student @{ layout = null; } <!doctype html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>index</title> </head> <body> <div> @using (html.beginform()) { //使用viewdata.modelstate.isvalid来判断modelstate的状态 if (viewdata.modelstate.isvalid) { if (viewbag.name != null) { <b> name:@viewbag.name<br/> email:@viewbag.email </b> } } <fieldset> <legend>student</legend> <div> @*生成label标签*@ @html.labelfor(model=>model.name) </div> <div> @*生成文本框*@ @html.editorfor(model=>model.name) @*不合法*@ //// @if (!viewdata.modelstate.isvalid)//这样写有问题正确的写法: @if (!viewdata.modelstate.isvalid &&viewdata.modelstate["email"].errors.count>0) { //从字典中获取错误消息:@viewdata.modelstate["name"].errors[0].errormessage <span style="color:red">@viewdata.modelstate["name"].errors[0].errormessage</span> } </div> <div> @html.labelfor(model=>model.email) </div> <div> @html.editorfor(model=>model.email) /////@if (!viewdata.modelstate.isvalid) 这样写有问题: // 正确的写法在下面 @if (!viewdata.modelstate.isvalid &&viewdata.modelstate["email"].errors.count>0) { //从字典中获取错误消息:@viewdata.modelstate["email"].errors[0].errormessage <span style="color:red">@viewdata.modelstate["email"].errors[0].errormessage</span> } </div> <p> <input type="submit" value="create"/> </p> </fieldset> } </div> </body> </html>
然后,修改一下默认的路由:
public static void registerroutes(routecollection routes) { routes.ignoreroute("{resource}.axd/{*pathinfo}"); routes.maproute( name: "default", url: "{controller}/{action}/{id}", defaults: new { controller = "student", action = "index", id = urlparameter.optional } ); }
运行之后,报错。查找了一下原因,修改了一下视图代码:
运行之后,
接着验证一下,name不为空,email输入非法格式的数据:
最后验证一下,输入合法的数据:
好了,现在看看第二种方式,使用数据注解来进行服务端验证:
新建一个类:避免混淆,
using system; using system.collections.generic; using system.componentmodel.dataannotations; using system.linq; using system.web; namespace server_side_validation_in_mvc.models { public class studentserver { [required(errormessage="name为必填项")] public string name { get; set; } [required(errormessage="电子邮件必须")] [emailaddress(errormessage="电子邮件格式不对")] public string email { get; set; } } }
在控制器中新建两个方法:
public actionresult seversideindex() { return view(); } [httppost] public actionresult seversideindex(studentserver model) { if (modelstate.isvalid) { viewbag.name = model.name; viewbag.email = model.email; } return view(); }
对应的视图:
@model server_side_validation_in_mvc.models.studentserver @{ layout = null; } @if (viewdata.modelstate.isvalid) { if (viewbag.name != null) { <b> name:@viewbag.name<br /> email:@viewbag.email </b> } } <!doctype html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>seversideindex</title> </head> <body> <div> @using (html.beginform()) { @html.validationsummary(true) <fieldset> <legend>student</legend> <div> @html.labelfor(model=>model.name) </div> <div> @html.editorfor(model=>model.name) @html.validationmessagefor(model=>model.name) </div> <div> @html.labelfor(model => model.email) </div> <div> @html.editorfor(model => model.email) @html.validationmessagefor(model => model.email) </div> <p> <input type="submit" value="create"/> </p> </fieldset> } </div> </body> </html>
首先验证,都为空的情况:
name不为空,email为空
name不为空,email输入非法格式数据
两个都输入合法的数据:
好了,以上就是mvc中服务端验证了,我们一般是使用第二种,来进行验证。也就是数据注解。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。