原文:mvc中动态给一个Model类的属性设置验证

在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这样的验证毕竟功能有限,那么就需要我们自己进行定制验证。

假设有Model类:class Dinners{

private string Title;

  

  private System.DateTime EventDate;

  

  private string Description;

  

  private string HostedBy;

  

  private string ContactPhone;

  

  private string Address;

  

  private string Country;

  

  private double Latitude;

  

  private double Longitude;

}

这里需要对该类的每个属性都加上不可为空的约束,并对电话号码、日期做验证。代码如下:

public partial class Dinners

    {

public bool IsValid

        {

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

        }

public IEnumerable<RuleViolation> GetRuleViolations()

        {

            if (String.IsNullOrEmpty(Title))

            {

                yield return new RuleViolation("Title required", "Title");

            }

            if (String.IsNullOrEmpty(Description))

            {

                yield return new RuleViolation("Description required", "Description");

            }

            if (String.IsNullOrEmpty(HostedBy))

            {

                yield return new RuleViolation("HostedBy required", "HostedBy");

            }

            if (String.IsNullOrEmpty(Address))

            {

                yield return new RuleViolation("Address required", "Address");

            }

            if (String.IsNullOrEmpty(Country))

            {

                yield return new RuleViolation("Country required", "Country");

            }

            if (String.IsNullOrEmpty(ContactPhone))

            {

                yield return new RuleViolation("Phone# required", "ContactPhone");

            }

//这里引用了类PhoneValidator(自定义验证类,不再详述)

            if (!PhoneValidator.IsValidNumber(ContactPhone, Country))

            {

                yield return new RuleViolation("Phone# does not match country", "ContactPhone");

            }

            yield break;

        }

partial void OnValidate(ChangeAction action)

        {

            if (!IsValid)

            {

                throw new ApplicationException("Rule violations prevent saving");

            }

        }

    }

public class RuleViolation

    {

        public string ErrorMessage { get; private set; }

        public string PropertyName { get; private set; }

public RuleViolation(string errorMessage, string propertyName)

        {

            ErrorMessage = errorMessage;

            PropertyName = propertyName;

        }

    }

前台验证代码:

<h2>Edit Dinner</h2>

    <%=Html.ValidationSummary("Please crrect the errors and try again.") %>

    <% using (Html.BeginForm()) {%>

       

        <fieldset>

            <p>

                <label for="Title">Dinner Title:</label>

                <%=Html.TextBox("Title") %>

                <%=Html.ValidationMessage("Title","*") %>

            </p>

            <p>

                <label for="EventDate">EventDate:</label>

                <%=Html.TextBox("EventDate",string.Format("{0:g}",Model.EventDate)) %>

                <%=Html.ValidationMessage("EventDate","*") %>

            </p>

            <p>

                <label for="Description">Description:</label>

                <%=Html.TextArea("Description") %>

                <%=Html.ValidationMessage("Description","*") %>

            </p>

            <p>

                <label for="Address">Address:</label>

                <%=Html.TextArea("Address") %>

                <%=Html.ValidationMessage("Address","*") %>

            </p>

            <p>

                <label for="Country">Country:</label>

                <%=Html.TextBox("Country") %>

                <%=Html.ValidationMessage("Country","*") %>

            </p>

            <p>

                <label for="ContactPhone">ContactPhone #:</label>

                <%=Html.TextBox("ContactPhone") %>

                <%=Html.ValidationMessage("ContactPhone","*") %>

            </p>

            <p>

                <label for="Latitude">Latitude:</label>

                <%=Html.TextBox("Latitude") %>

                <%=Html.ValidationMessage("Latitude","*") %>

            </p>

            <p>

                <label for="Longitude">Longitude:</label>

                <%=Html.TextBox("Longitude") %>

                <%=Html.ValidationMessage("Longitude","*") %>

            </p>

            <p>

                <input type="submit" value="Save" />

            </p>

        </fieldset>

<% } %>

<div>

        <%= Html.ActionLink("Back to List", "Index") %>

    </div>

注:代码来自教程《一步一步学习asp.net mvc》

mvc中动态给一个Model类的属性设置验证的更多相关文章

  1. 新建一个Model类的注意事项

    昨天在工作中新建了一个Model类在测试环境测试一点问题也没有,到了生产环境就报错了,由于调用的是分页类,报错说:在520行 _count() 函数不存在. 我的思路是:先到生产环境查看了具体的报错文 ...

  2. 为什么java源文件中只允许一个public类存在

    1.提出问题 为什么java源文件中只允许一个public类存在? 2.分析问题 问题涉及到的条件:源文件的名字    public类     main方法 一般我们在编写一个源文件的时候: 一个pu ...

  3. 为什么一个java源文件中只能有一个public类

    问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件 ...

  4. 浅谈为什么一个java源文件中只能有一个public类?

    声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为pub ...

  5. iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

    在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property ...

  6. EBS OAF开发中实体对象和视图对象的属性设置器

    EBS OAF开发中实体对象和视图对象的属性设置器 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle ...

  7. 关于Emit中动态类型TypeBuilder创建类标记的一点思考

      利用TypeBuilder是可以动态创建一个类型,现在有个需求,动态生成一个dll,创建类型EmployeeEx,需要继承原dll里面的Employee类,并包含Employee类上的所有类标记. ...

  8. Qt中如何写一个model

    在qt中,用到最多就是model/view的结构来表示数据层及表示层的关系.model用于给view提供数据.那如何来实现一个简单的树形model呢. 实现一个自己的model需要重载以下的方法: Q ...

  9. Qt中如何写一个model(自定义一个RowNode,我没有碰到过)

    在qt中,用到最多就是model/view的结构来表示数据层及表示层的关系.model用于给view提供数据.那如何来实现一个简单的树形model呢. 实现一个自己的model需要重载以下的方法: Q ...

随机推荐

  1. Swift 书面 ToDo App

    下面的代码是使用的全部Xcode Version 6.0.1 (6A317)书面. 因为当使用团队开发stroyboard在并购的诸多不便的时间,所有或使用.xib该文件准备ToDo App. 想要实 ...

  2. plsql dev中Dynamic Performance Tables not accessible分析解决(转)

    使用plsql dev的朋友多遇到过类此如下面的提示: Dynamic Performance Tables not accessible, Automatic Statistics Disabled ...

  3. python 性能- and-or 学习技能

    C语言类似表情: bool ? a : b ,当表达式值为真的话,值为a.否则为b. 看一个样例: >>> a = "first" >>> b ...

  4. 使用一个T-SQL语句批量查询数据表占用空间及其行数

    原文:使用一个T-SQL语句批量查询数据表占用空间及其行数 要找到数据库中数据表占用的空间和存在的行数.可以使用sp_spaceused搭配数据表的名称.就可以产生该表耗用的空间和现有行数. 如: U ...

  5. 一步一步学习ASP.NET 5 (三)- 认识新的Web结构

    编者语 : 今天微软的两大盛事,早上有久违的Microsoft HEC 2015 晚上有DotnetConf 2015.假若你做微软的技术怎么能够错过呢?说说我的连载吧,前两篇分别介绍了ASP.NET ...

  6. UVA714- Copying Books(最大最小化)

    意甲冠军:k手稿的部分成m部分,使每一个和最小 思路:典型最大值最小化问题,使用贪心+二分. 贪心的是每次尽量将元素往右边划分,二分查找最小的x满足m个连续的子序列和S(i)都不超过x. 由于输出的原 ...

  7. C#程序(含多个Dll)合并成一个Exe

    把C#程序(含多个Dll)合并成一个Exe的超简单方法   开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一 ...

  8. 熟人Dubbo 系列1-Dubbo什么

    Dubbo阿里巴巴内部SOA治理方案和服务的核心框架.每天2000+ 个服务提供3,000,000,000+ 次訪问量支持,并被广泛应用于阿里巴巴集团的各成员网站.Dubbo自2011年开源后,已被很 ...

  9. .net程序调用检测和性能分析工具——DotTrace

    DotTrace可以对.net程序进行性能监测,对正在运行的程序和网站监控,主要界面如下: 需要将该工具安装在程序运行的服务器上. 主要用到这个视图,显示了每个方法的时间,下面是反编译出来的代码. P ...

  10. SpringData JPA的学习笔记之环境搭建

    一.环境搭建 1.加入jar包   spring jar+jpa jar +springData jar >>SpringData jar包     2.配置applicationCont ...