ASP.NET MVC实践系列3-服务器端数据验证
我们这里主要讲解ASP.NET MVC中服务器端得数据验证,至于客户端验证我们会在以后的系列中讲到。
在Controller中有一个ModelState属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合。在进行数据验证的时候这个属性是比较有用的。在使用Html.ValidationMessage()的时候,就是从ModelState中检测是否有指定的KEY,如果存在,就提示错误信息。
1、基本实例
在View中添加如下文件
<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="id">id:</label>
<%= Html.TextBox("id", Model.id) %>
<%= Html.ValidationMessage("id", "*") %>
</p>
<p>
<label for="Title">Title:</label>
<%= Html.TextBox("Title", Model.Title) %>
<%= Html.ValidationMessage("Title", "*") %>
</p>
<p>
<input type="submit" value="Save" />
</p>
</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">*</span>
CSS类的样式是可以由我们自己自由定义的
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<RuleViolation> GetRuleViolations()
{
if (String.IsNullOrEmpty(Title))
yield return new RuleViolation("必须要输入标题", "Title");
if (String.IsNullOrEmpty(Author))
yield return new RuleViolation("必须要输入作者", "Author");
yield break;
}
}
Controller中填入如下代码
[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分布方法。
3、源码
4、参考:
http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html
《Professional ASP.NET MVC 1.0》
作者:Lance
出处:http://www.cnblogs.com/nuaalfm/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。