zoukankan      html  css  js  c++  java
  • ASP.NET MVC实践系列3服务器端数据验证

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

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

    1、基本实例

    在View中添加如下文件

    Code
    <%= 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中添加如下代码

    Code
    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":

    Code
     <input class="input-validation-error" id="Title" name="Title" type="text" value="" />
                    
    <span class="field-validation-error">*</span>

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

    2、应用

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

    Code
     public class RuleViolation
        {
            
    public string ErrorMessage { getprivate set; }
            
    public string PropertyName { getprivate set; }
            
    public RuleViolation(string errorMessage)
            {
                ErrorMessage 
    = errorMessage;
            }
            
    public RuleViolation(string errorMessage, string propertyName)
            {
                ErrorMessage 
    = errorMessage;
                PropertyName 
    = propertyName;
            }
        }

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

    Code
    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中填入如下代码

    Code
    [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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Ionic
    图片破碎 效果 修正
    去掉浏览器右侧动滚条宽度对页面的影响
    ng 依赖注入
    ng 通过factory方法来创建一个心跳服务
    ng 自定义服务
    ng $http 和远程服务器通信的一个服务。
    ng $interval(周期性定时器) $timeout(延迟定时器)
    ng $scope与$rootScope的关系
    函数重载
  • 原文地址:https://www.cnblogs.com/nuaalfm/p/1590532.html
Copyright © 2011-2022 走看看