ASP.NET MVC数据验证(上)

关于ASP.NET MVC的验证,用起来很特别,因为MS的封装,使人理解起来很费解。也可能很多人都在Scott Guthrie等人写的一本《ASP.NET MVC 1.0》书中,见过NerdDinner项目中对Dinner对象修改和添加的时的数据验证。但有许多封装的地方,不知道是怎样的工作原理,今天研究了,拿出来给大家分享一下。
数据库还是上一篇blog中的库与表,同样的方法来创建news表的实体类,在自动生成的news这个实体类中,我们发现有一个特殊的分部方法:
partial void OnValidate(System.Data.Linq.ChangeAction action);<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

这个方法没有实现,我们根据C#的语法知道,如果分部类中的分部方法,没有实现的话,调用和定议的地方都不会起什么作用。现在,我们要去完善这个方法,让它“用”起来。
首先,人产在Models中创建news类的另一部分,代码如下:
    public partial  class news

    {

        partial void OnValidate(System.Data.Linq.ChangeAction action)

        {

            if (!IsValid)

            {

                throw new ApplicationException("验证内容项出错!");

            }

        }

        public bool IsValid

        {

            get { return (GetRuleViolations().Count() == 0); }

        }

        public IEnumerable<RuleViolation> GetRuleViolations()

        {

            if (String.IsNullOrEmpty(this.title .Trim () ))

                yield return new RuleViolation("题目步能为空!", "题目");

            if (String.IsNullOrEmpty(this.contents .Trim ()))

                yield return new RuleViolation("内容不能为空!", "内容");         

            yield break;

        }

    }

/// <summary>

    /// 规则信息类

    /// </summary>

    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;

        }

    }

在这里给出这么多代码,其实是提前有设计的,因为从业务角度考虑,还不应该写这部分代码。RuleViolation类很简单,就是一个包括了两个属性的类(这个类的结构设计是根据后面的ModelState.AddModelError主法来设计的)。
news分部类中,有一个IsValid的属性,这个属性是bool类型的,返回值取决于GetRuleViolations这个方法,这个方法返回值是一个IEnumerable<RuleViolation>类型的,IEnumerable是通过news的几个属性是否为空来生成跌代的。如果titlecontentsNull””,就返回跌代。其实真正的用户数据的验证就是在这里实现,用户的数据的对与错,就是一个逻辑,只要用户数据不符合规则,就可以 “yield return new RuleViolation("错误标识","错误提示信息!");这里的错误码提示信息是显示到客户端的,所以要处理好友好的提示。
现在验证用户数据,生成错误列表的工作都做完了,但关键是怎么能让用户提交数据时,调用OnValidate。这个问题,先放一下,请记住,上面的代码,只要在用户提交数据时,调用OnValidate,这样就能得到错误集合。
现在,让我们来处理CotrollerView层,在Cotroller层,首先来添加index这个Action,代码如下:
public ActionResult Index()

        {          

            var NewsList = DCDC.news.Select(newss=>newss);

            return View(NewsList );

     }
这个Action返回所有news表中的记录。
对应的View如下:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcCompany.Models.news>>" %>

 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">

     Index

</asp:Content>

 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

 

    <h2>Index</h2>

 

    <table>

        <tr>

            <th></th>

            <th>

                ID

            </th>

            <th>

                title

            </th>

            <th>

                datetimes

            </th>

            <th>

                contents

            </th>

            <th>

                IsValid

            </th>

        </tr>

 

    <% foreach (var item in Model) { %>

   

        <tr>

            <td>

                <%= Html.ActionLink("Edit", "Edit", new { id=item.ID }) %> |

                <%= Html.ActionLink("Details", "Details", new { id=item.ID })%>

            </td>

            <td>

                <%= Html.Encode(item.ID) %>

            </td>

            <td>

                <%= Html.Encode(item.title) %>

            </td>

            <td>

                <%= Html.Encode(String.Format("{0:g}", item.datetimes)) %>

            </td>

            <td>

                <%= Html.Encode(item.contents) %>

            </td>

            <td>

                <%= Html.Encode(item.IsValid) %>

            </td>

        </tr>

   

    <% } %>

 

    </table>

 

    <p>

        <%= Html.ActionLink("Create New", "Create") %>

    </p>

 

</asp:Content>

 

代码中,需要我们注意是的    <%= Html.ActionLink("Edit", "Edit", new { id=item.ID }) %>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 的基本组件之一 Gallery

声明&#xff1a;本人博客纯属个人学习过程中的一些仿写的简单练习记录&#xff0c;其他论坛也有类似内容&#xff01;&#xff08;可能不免有错误之处&#xff0c;还望见谅&#xff0c;指出&#xff09;这是一个最简单可以滑动查看图片的应用程序&#xff1a;首先创建项目名为…

【设计模式】—— 中介者模式Mediator

前言&#xff1a;【模式总览】——————————by xingoo 模式意图 使用一个中介的对象&#xff0c;封装一组对象之间的交互&#xff0c;这样这些对象就可以不用彼此耦合。 这个中介者常常起着中间桥梁的作用&#xff0c;使其他的对象可以利用中介者完成某些行为活动&#…

contos6.5卸载php7,centos8 测地卸载php5.6 与卸载php7

centos8 yum php 默认安装 php7.1.2我想卸载php7 &#xff0c;安装php5.6yum remove php 无法彻底卸载干净。必须强制删除&#xff0c;使用下面命令查看全部php软件包rpm -qa|grep php&#xff0c;然后安装指定顺序卸载卸载php7.X[rootxxx php-memcached]# rpm -qa | grep phpp…

【招聘(上海)】美团酒店招聘 .NET 高级开发

美团酒店介绍&#xff1a;美团酒店是美团旗下的综合住宿服务平台&#xff0c;始终秉承“帮大家住得更好”的使命。成立以来&#xff0c;屡次刷新中国在线住宿行业新纪录。目前&#xff0c;美团已覆盖超过40万家国内酒店&#xff0c;以及全球200多个国家的50000多个城市。我们求…

mysql数据库主要用来做什么的_水晶头骨用来做什么的?

1927年一个小女孩在挖掘时&#xff0c;发现了一颗人头骨。这颗头骨是用水晶做成的&#xff0c;之后关于水晶头骨之谜一直被人津津乐道&#xff0c;人们一直在猜测水晶头骨用来做什么的&#xff1f;一共有多少个&#xff1f;在小女孩挖到这颗头骨之前&#xff0c;大英博物馆里就…

日本画风超级“诡异”毕业典礼上线,网友:有被吓到,谢谢!

转眼间又到了日本毕业季&#xff0c;四月份本来是日本毕业季。在日本&#xff0c;毕业季是非常仪式感的存在&#xff1a;学校里会满是穿着浴衣、盛装打扮的小哥哥小姐姐&#xff0c;拿着毕业证书&#xff0c;在樱花树下合照。图片来源&#xff1a;日剧《对不起&#xff0c;青春…

文本文件的读写

// 读文件 public TextWriter w; // 写文件 public TextReader r; // 读文本文件 private void button1_Click(object sender, System.EventArgs e) { if(openFileDialog1.ShowDialog() DialogResult.OK) { textBox1.Text openFileDialog1.FileName; r new StreamReader(ope…

博客编辑工具ckeditor

在asp网站开发过程当中常常用到漂亮的编辑工具。 在这个网站有不少&#xff1a;http://ckeditor.com/ 而且下载下来就可以使用&#xff0c;是开源的。它不像asp里面的.dll控件拖进来就可以使用&#xff0c;而是通过调用的方式使用。 下载下来解压之后就可以直接包含在项目中&am…

java单链表查询功能,Java 实现简答的单链表的功能

作者&#xff1a;林子木 博客网址&#xff1a;http://blog.csdn.net/wolinxuebin參考网址&#xff1a;http://blog.csdn.net/sunsaigang/article/details/5751780描写叙述&#xff1a;使用java实现简答的单链表的功能定义了一个MyList类包括的函数&#xff1a;getHead()返回头…

记一次 .NET 某流媒体独角兽 API 句柄泄漏分析

一&#xff1a;背景 1. 讲故事上上周有位朋友找到我&#xff0c;说他的程序CPU和句柄都在不断的增长&#xff0c;无回头趋势&#xff0c;查了好些天也没什么进展&#xff0c;特加wx寻求帮助&#xff0c;截图如下&#xff1a;看的出来这位朋友也是非常郁闷&#xff0c;出问题还出…

iphone最新款手机_苹果罕见“跌停”!遭遇6年来最惨淡一夜,2019年全球股市第一颗雷引爆...

2019年全球股市的第一颗大雷引爆了。受苹果下调营收预期影响&#xff0c;周四盘中&#xff0c;苹果股价一度跌至142.08美元&#xff0c;创逾一年半新低&#xff0c;日内跌幅超过10%&#xff0c;市值缩水750亿美元。最终&#xff0c;苹果收跌9.96%&#xff0c;创出自2013年1月以…

MVC学习之分页 【转】

分页如果dinners列表记录过多&#xff0c;为了让用户更方便浏览&#xff0c;我们需要实现分页显示&#xff0c;而不是一次显示大量的记录列表。Index() Action方法更新DinnersController类的Index() action方法代码如下&#xff1a;//// GET: /Dinners/public ActionResult Ind…

构件图

构件图 目录 构件图概要... 1 构件图中的事物及解释... 1 构件图中的关系及解释... 1 我的构件图... 1 构件图用于静态建模&#xff0c;是表示构件类型的组织以及各种构件之间依赖关系的图。构件图通过对构件间依赖关系的描述来估计对系统构件的修改给系统可能带来的影响…

不小心把硬盘摔了一下,结果电脑变成这样了......

1 会主动要求换尿裤的小宇航员▼2 其实赚钱这个事儿我也不太会▼3 春困、夏倦、秋乏、冬眠一年四季都好适合睡觉啊&#xff01;▼4 这是硬盘摔了&#xff0c;结果把显示器心疼坏了吧&#xff1f;▼5 柯基&#xff1a;弱小、可怜▼6 朋友相册里的你▼7 人类迷惑行为之放生…

java实现数字转mac,Java Ethernet.getSourceMAC方法代码示例

import org.onlab.packet.Ethernet; //导入方法依赖的package包/类/*** Process an incoming PIM Hello message. There are a few things going on in* this method:* * We may have to create a new neighbor if one does not already exist* We may need to re-elect a new …

win10前置耳机插孔没声音_音频服务未运行怎么办?win7和win10电脑没声音了恢复方法...

很多人可能都会问电脑没声音了&#xff0c;如何恢复&#xff1f;其实造成这种情况的原因有很多&#xff0c;一般需要一个一个排查。这次&#xff0c;小编跟大家分享其中的一个原因&#xff0c;以及具体的解决方法。个别小伙伴的笔记本电脑&#xff0c;每次开机总会提示音频服务…

开源 java CMS - FreeCMS2.2 系统配置

2019独角兽企业重金招聘Python工程师标准>>> 项目地址&#xff1a;http://www.freeteam.cn/ 系统配置 管理系统使用的配置项。 从左侧管理菜单点击系统配置进入。 从FreeCMS 1.7开始支持 数据变更后栏目页面静态化间隔时间(单位为分)&#xff1a;修改栏目、更新…

EF Core使用Simple Logging输出日志

在使用EF Core的时候&#xff0c;很多时候需要知道EF Core实际执行的SQL语句是什么。Simple Logging是EF Core提供的一项功能&#xff0c;可用于在开发和调试应用程序时轻松获取日志。这种形式的日志记录需要最少的配置&#xff0c;而不需要其他NuGet包。功能一瞥配置起来非常简…

项目执行过程

执行过程组包含完成项目管理计划中确定的工作以实现项目目标的一组过程。包括以下项目管理过程&#xff1a; 指导与管理项目执行&#xff1a; 实现项目目标而执行项目管理计划中所确定的工作的过程实施质量保证&#xff1a;审计质量要求和质量控制测量结果组建项目团队&#xf…

一步一步学Ruby(二十一):文件操作2

1、打开读取文件 file File.open( "cnblogslink.txt" ) file.each { |line| print "#{file.lineno}. ", line } file.close 输出: 1. 社区 2. 新闻 3. 社区 4. 新闻 5. 招聘 6. 博问 7. 小组 8. 闪存 9. 网摘 10. .NET频道 file.lineno显示的是行号 2、…