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

简介: 原文: mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这样的验证毕竟功能有限,那么就需要我们自己进行定制验证。
原文: 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》

 

目录
相关文章
|
前端开发 Java API
Spring MVC相关异常类
Spring MVC相关异常类
70 0
|
4月前
|
前端开发 JavaScript
MVC中简单数据模型(M): Model类
MVC中简单数据模型(M): Model类
|
存储 前端开发 Java
Spring MVC 中的数据绑定和验证机制是什么,如何使用
Spring MVC 中的数据绑定和验证机制是什么,如何使用
|
7月前
ssm(Spring+Spring mvc+mybatis)Service层实现类——DeptServiceImpl
ssm(Spring+Spring mvc+mybatis)Service层实现类——DeptServiceImpl
|
7月前
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
|
7月前
|
缓存 前端开发 Java
【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法
【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法
|
JSON 前端开发 Java
30个类手写Spring核心原理之MVC映射功能(4)
接下来我们来完成MVC模块的功能,应该不需要再做说明。Spring MVC的入口就是从DispatcherServlet开始的,而前面的章节中已完成了web.xml的基础配置。下面就从DispatcherServlet开始添砖加瓦。
52 0
|
XML NoSQL Java
干掉 CRUD!这个API开发神器效率爆炸,无需定义MVC类!!
magic-api 能够只通过 UI 界面就能完成简单常用的接口开发,能够支持市面上多数的关系性数据库,甚至还支持非关系性数据库 MongoDB。 通过 magic-api 提供的 UI 界面完成接口的开发,自动映射为 HTTP 接口,无需定义 Controller、Service、Dao、Mapper、XML、VO 等 Java 对象和相关文件! 该项目已经有上千家公司使用,上万名开发者使用,并有上百名程序员提交建议,20+ 贡献者,是非常值得信赖的项目!
|
前端开发 Java Spring
《Spring MVC》 第八章 拦截器实现权限验证、异常处理
《Spring MVC》 第八章 拦截器实现权限验证、异常处理
237 0
|
设计模式 前端开发 安全
Spring MVC-01循序渐进之Model 2和MVC
Spring MVC-01循序渐进之Model 2和MVC
71 0