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

简介:

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

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

1、基本实例

在View中添加如下文件

复制代码
ExpandedBlockStart.gif 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中添加如下代码

复制代码
ExpandedBlockStart.gif 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验证控件差不多。

运行程序得到的结果为:

2009102711045487.jpg

Html.ValidationMessage()方法会为出错的属性的输入框添加一个名为"input-validation-error"的CSS类,同时后面的提示信息的CSS类名为"field-validation-error":

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

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

2、应用

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

复制代码
ExpandedBlockStart.gif 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类,来用于验证属性

复制代码
ExpandedBlockStart.gif 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中填入如下代码

复制代码
ExpandedBlockStart.gif 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》

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

相关文章
|
6月前
|
前端开发 Java Go
Spring MVC 中的数据验证技术
Spring MVC 中的数据验证技术
48 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
100 5
|
4月前
net实践记录
net实践记录
18 0
|
4月前
|
开发框架 .NET 数据安全/隐私保护
Asp.Net第二章服务器端控件
Asp.Net第二章服务器端控件
27 0
|
4月前
|
开发框架 .NET
Asp.Net就业课之案例实践第二次课
Asp.Net就业课之案例实践第二次课
23 0
Asp.Net就业课之案例实践第二次课
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0
|
8月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(完:内附源码)
经过一段时间的准备,【ASP.NET Core MVC开发实战之商城系统】已经完成,目前代码已开发完成,先将全部内容整理分享,如有不足之处,还请指正。
107 0
|
8月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(六)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情,购物车等功能的开发,今天继续讲解订单管理功能开发,仅供学习分享使用,如有不足之处,还请指正。
215 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
117 0

相关实验场景

更多