在controller中有一个modelstate属性,这是一个类型为modelstatedictionary的modelstate类型的字典集合。在进行数据验证的时候这个属性是比较有用的。在使用html.validationmessage()的时候,就是从modelstate中检测是否有指定的key,如果存在,就提示错误信息。
1、基本实例
在view中添加如下文件
<%= html.validationsummary("edit was unsuccessful. please correct the errors and try again.") %>
<%= html.validationsummary("edit was unsuccessful. please correct the errors and try again.") %> <% using (html.beginform()) {%> <fieldset> <legend>fields</legend>
</fieldset> <% } %> |
在相应的controller中添加如下代码
public actionresult newsedit(int id) { newsdatadatacontext dc = new newsdatadatacontext(); return view(dc.news.first(n => n.id == id)); } [acceptverbs(httpverbs.post)] public actionresult newsedit(int id, formcollection formvalues) { news news = new news(); updatemodel(news); if (string.isnullorempty(news.title)) { modelstate.addmodelerror("title", "title不能为空"); } else { //进行更新 } return view(news); } |
view中使用html.validationmessage(string modelname)来对指定的属性进行验证:这里仍然使用的是mvc中默认的约定,modelname的内容如果和modelstate中的key值一样是就显示。
其中validationsummary()是用于显示全部的验证信息的。跟asp.net里面的validationsummary验证控件差不多。
运行程序得到的结果为:
html.validationmessage()方法会为出错的属性的输入框添加一个名为"input-validation-error"的css类,同时后面的提示信息的css类名为"field-validation-error":
<input class="input-validation-error" id="title" name="title" type="text" value="" /> <span class="field-validation-error">* |
css类的样式是可以由我们自己自由定义的
我们这里主要讲解asp.net mvc中服务器端得数据验证,至于客户端验证我们会在以后的系列中讲到。2、应用
这里我们为之前的news实例添加服务器端验证,首先我们需要一个传递错误信息的类
public class ruleviolation { public string errormessage { get; private set; } public string propertyname { get; private set; } public ruleviolation(string errormessage) { errormessage = errormessage; } public ruleviolation(string errormessage, string propertyname) { errormessage = errormessage; propertyname = propertyname; } } |
然后为dbml中的news类添加一个partial类,来用于验证属性
public partial class news { public bool isvalid { get { return (getruleviolations().count() == 0); } } partial void onvalidate(changeaction action) { if (!isvalid) throw new applicationexception("rule violations prevent saving"); } public ienumerable getruleviolations() { if (string.isnullorempty(title)) yield return new ruleviolation("必须要输入标题", "title"); if (string.isnullorempty(author)) yield return new ruleviolation("必须要输入作者", "author"); yield break; } } |
[acceptverbs(httpverbs.post)] public actionresult newsedit(int id, formcollection formvalues) { newsdatadatacontext dc = new newsdatadatacontext(); news news = dc.news.first(n => n.id == id); try { updatemodel(news); dc.submitchanges(); return redirecttoaction("details", new { id = id }); } catch (exception) { foreach (var issue in news.getruleviolations()) { modelstate.addmodelerror(issue.propertyname, issue.errormessage); } return view(news); } } |
注:当对datadatacontext执行submitchanges方法时会触发onvalidate分布方法。