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

原文: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类的属性设置验证

时间: 2024-10-11 09:10:08

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

新建一个Model类的注意事项

昨天在工作中新建了一个Model类在测试环境测试一点问题也没有,到了生产环境就报错了,由于调用的是分页类,报错说:在520行 _count() 函数不存在. 我的思路是:先到生产环境查看了具体的报错文件,发现520行 _count() 函数存在,把runtime清理了还是不行:下一步是查看Model类文件的权限,发现是644,而其他Model类的权限都是664,修改为664就OK了.

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

  利用TypeBuilder是可以动态创建一个类型,现在有个需求,动态生成一个dll,创建类型EmployeeEx,需要继承原dll里面的Employee类,并包含Employee类上的所有类标记.   网上有很多例子, //创建TypeBuilder. TypeBuilder myTypeBuilder = myModBuilder.DefineType(typeName, TypeAttributes.Public); myTypeBuilder.SetParent(type);   大概

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

声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错:后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找,转载,感谢作者. 结论: 一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必 须与之一致,否则无法编译,如果源文件中

mvc中razor的一个bug

具体东西就不多说了,所有编译,代码都是木有问题的. 结果预览页面的时候竟然告诉我编译错误,尼玛这不科学啊. 来看看错误页面 看着问题大概应该是缺少} ,或者多了个} 倒置的编译错误才对,但是编译生成完全没有问题啊,没办法,既然报这个问题,那肯定是最终合并生成的代码文件存在bug 那到底是哪里出的问题呢,没办法,硬着头皮查吧. 1.显示试着调试运行了一下页面,发现后台完全没问题.return view() 后,就出现了黄页. 那问题应该就是在html页面中了,那就来看看html页面中有些什么吧.

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

问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同. 为什么一个java源文件中只能有一个public类? 在java编程思想(第四版)一书中有这样3段话(6.4 类的访问权限): 1.每个编译单元(文件)都只能有一个public类,这表示,每个编译单元都有单一的公共接口,用pub

iOS开发&gt;学无止境 - 遍历Model类的属性并完善使用Runtime给Model类赋值

在前几天的一篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name相同,然后通过运行时来生成和执行Setter方法给Model类的属性赋值. 通 过Runtime来给Model类属性赋值的好处是多多的,它便于代码的后期维护,并且提高了开发效率.当你拿到解析后的字典时你不用一个一个的通过 key去把字典的值赋值给相应的Model类的属性,本篇博客中会给出如何

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

http://www.cocoachina.com/ios/20150807/12877.html 在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name相同,然后通过运行时来生成和执行Setter方法给Model类的属性赋值. 通过Runtime来给Model类属性赋值的好处是多多的,它便于代码的后期维护,并且提高了开发效率.当你拿到解析后的字典时你

实体类作为另一个实体类的属性

如果一个实体类作为另一个实体类的属性,如果对该属性赋值的时候直接赋一个对象就行了,如果有多个对象同时赋给那个属性 就可以用List集合去接收,就像微信开发里面的图文消息 ,如果回复的是多条图文消息就用list集合去装t它们. 今天早上被技术总监说了一顿,就是他将很多种类都写在一个文件里面,而我一般都是将类写在一个单独的文件里面,我很奇怪这种写法.在QQ群里和人讨论了一下,觉得类应该是单独的建一个文件去写,这样不管是后期维护,还是查阅修改,都会很方便.还有一种所有实体类加partial.需要手动改

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

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle Application Framework Documentation Set, Release 12.2 > Oracle Application Framework Developer's Guide > Chapter 5: Implementing Server-Side Features > Entity Object and Vi