天天看点

ASP.NET MVC实践系列3-服务器端数据验证

我们这里主要讲解ASP.NET MVC中服务器端得数据验证,至于客户端验证我们会在以后的系列中讲到。

在Controller中有一个ModelState属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合。在进行数据验证的时候这个属性是比较有用的。在使用Html.ValidationMessage()的时候,就是从ModelState中检测是否有指定的KEY,如果存在,就提示错误信息。

1、基本实例

在View中添加如下文件

<a></a>

ASP.NET MVC实践系列3-服务器端数据验证

Code

&lt;%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %&gt;

    &lt;% using (Html.BeginForm()) {%&gt;

        &lt;fieldset&gt;

            &lt;legend&gt;Fields&lt;/legend&gt;

            &lt;p&gt;

                &lt;label for="id"&gt;id:&lt;/label&gt;

                &lt;%= Html.TextBox("id", Model.id) %&gt;

                &lt;%= Html.ValidationMessage("id", "*") %&gt;

            &lt;/p&gt;

                &lt;label for="Title"&gt;Title:&lt;/label&gt;

                &lt;%= Html.TextBox("Title", Model.Title) %&gt;

                &lt;%= Html.ValidationMessage("Title", "*") %&gt;

             &lt;p&gt;

                &lt;input type="submit" value="Save" /&gt;

        &lt;/fieldset&gt;

    &lt;% } %&gt;

在相应的Controller中添加如下代码

ASP.NET MVC实践系列3-服务器端数据验证

public ActionResult NewsEdit(int id)

        {

            NewsDataDataContext dc = new NewsDataDataContext();

            return View(dc.News.First(n =&gt; 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":

ASP.NET MVC实践系列3-服务器端数据验证

 &lt;input class="input-validation-error" id="Title" name="Title" type="text" value="" /&gt;

                &lt;span class="field-validation-error"&gt;*&lt;/span&gt;

CSS类的样式是可以由我们自己自由定义的

2、应用

这里我们为之前的News实例添加服务器端验证,首先我们需要一个传递错误信息的类

ASP.NET MVC实践系列3-服务器端数据验证

 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)

            PropertyName = propertyName;

    }

然后为dbml中的News类添加一个partial类,来用于验证属性

ASP.NET MVC实践系列3-服务器端数据验证

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&lt;RuleViolation&gt; GetRuleViolations()

            if (String.IsNullOrEmpty(Title))

                yield return new RuleViolation("必须要输入标题", "Title");

            if (String.IsNullOrEmpty(Author))

                yield return new RuleViolation("必须要输入作者", "Author");

            yield break;

Controller中填入如下代码

ASP.NET MVC实践系列3-服务器端数据验证

[AcceptVerbs(HttpVerbs.Post)]

            News news = dc.News.First(n =&gt; 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分布方法。

4、参考:

<a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html">http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html</a>

《Professional ASP.NET MVC 1.0》

本文转自 你听海是不是在笑 博客园博客,原文链接:http://www.cnblogs.com/nuaalfm/archive/2009/10/27/1590532.html  ,如需转载请自行联系原作者

继续阅读