原文: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. UVA11396-Claw Decomposition(二分图判定)

    题目链接 题意:能否将一张无向连通图分解成多个爪型.每一条边仅仅能属于一个爪型,每一个点的度数为3. 思路:当图分解成类干个爪型时,每条边仅仅属于一个爪子,所以每条边的两个点一定要处于2个不同的鸡爪中 ...

  2. C# 使用WinRar命令压缩和解压缩

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  3. Maven本地仓库配置

    一. 为什么配置? 默认情况下,maven的本地仓库在C盘下用户文件夹: .m2/repository.全部的maven构件(artifact)都被存储到该仓库中.以方便重用. 可是放在C盘一个是占用 ...

  4. 简单的方法来改善手机3G上网速度(2G转3G)

           这里提到的方法是将手机信号不好的地方(也就是2G信号)强制转换为3G信号上网以至于提高上网速度,大家常常看到在某个地方(比方坐地铁)手机明明是3G卡,却显示的是2G信号,这就是手机老在2 ...

  5. android利用jdk制作签名

    Apk签名首先要有一个keystore的签名用的文件. keystore是由jdk自带的工具keytool生成的.详细生成方式參考一下: 開始->执行->cmd->cd 到你安装的j ...

  6. SharePoint 2013 配置启用搜索服务

    原文:SharePoint 2013 配置启用搜索服务 1.安装完毕SharePoint 2013,新建网站集,点击搜索,出现如下错误(因为没配置,别激动). 2.尝试启动服务器场中的服务之Share ...

  7. Android Studio常见报错及处理办法

    在Android Studio上点了update,系统自动升级,自动重启Android Studio后,以前的项目Gradle正常编译: Unable to start the daemon proc ...

  8. git fetch, merge, pull, push需要注意的地方(转)

    在git操作中,我们经常会用到fetch, merge, pull和push等命令,以下是一些我们需要注意的地方. 给大家准备了参考资料: 1. Whatʼs a Fast Forward Merge ...

  9. Unity3D移动端内存优化(NGUI方面)

     Unity3D引擎技术交流QQ群:[21568554] 做3d移动端内存一直是人们头疼的问题,载入的资源释放了,还有其它的须要释放.比方ngui释放,事实上主要是NGUI的Texture和Spr ...

  10. Message解析流程(转)

    Message的解析作为一个共同组件.对应不同格式的msg文件有不同的实现类来解析.用SAXParser. 1:Final class MessageResourceManager   在Start方 ...