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》

 

时间: 2024-12-31 02:36:21

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

flash as3 中动态加载库类失败解决方法

flash as3 中动态加载库类失败解决方法 这是错误的写法 for (var i:number=1; i<4; i++) { var mc1:mc1 = new mc1(); addchild(mc1); } as3里怎么循环加载库里的mc1 mc2 mc3类 就是下面意思是怎样个的写法 for (var i:number=1; i<4; i++) { var "mc"+i:"mc"+i = new "mc"+i(); addch

如何在MFC对话框程序中动态创建一个单文档。

问题描述 如何在MFC对话框程序中动态创建一个单文档. 就是在MFC对话框程序里单击一个按钮可以出现一个单文档界面,是MFC对话框的框架 解决方案 再做一个单文档的exe,点击按钮,启动它

html 扇形统计图 js-html中动态生成一个扇形统计图

问题描述 html中动态生成一个扇形统计图 html中动态生成一个扇形统计图,怎么实现?(不是生成图片,因为扇形图上的每一块都有js效果) 解决方案 看看jqchart 解决方案二: 000000000000000000000 解决方案三: 饼图插件:CSDN移动问答

extjs4-请问如何在window中动态添加一个列表

问题描述 请问如何在window中动态添加一个列表 我现在要在window中动态的添加一个grid, 前面有一些逻辑判断, 请问各位当满足特定条件下如何能动态的添加一个grid在window中 解决方案 用createwindow函数 也可以事先添加好,但是设置为隐藏,然后直接显示

C#在dataGridView中动态添加一个combox

问题描述 急求大神!!我在dataGridVIew1的某一列中动态添加一个combox,然后出现下面的情况: 解决方案 解决方案二:publicComboBoxmycombo=newComboBox();//全局变量....form_load(...){mycombo.Name="mycombo";mycombo.Items.Clear();mycombo.Items.Add("三甲");mycombo.Items.Add("二甲");mycom

WPF 中怎么把一个Window类 转变为TabControl 的选项卡

问题描述 WPF中怎么把一个Window类转变为TabControl的选项卡转变成TabItem类 解决方案 解决方案二:就是把一个exe程序变为Tabcontrol的选项卡解决方案三:wpf如何把窗体设为顶级窗体'Window必须是树的根目录.不能将Window添加为Visual的子目录.'TransactionWindowwinTrans=newTransactionWindow();winTrans.Topmost=false;winTrans.WindowStyle=WindowStyl

mvc-关于MVC中cshtml的一个问题,代码不是很懂,希望来个懂得给我详解一下@

问题描述 关于MVC中cshtml的一个问题,代码不是很懂,希望来个懂得给我详解一下@ $('div.choose-tab dl#cata dd a').click(function () { getBrandByCata($(this).attr("catavalue"), 0); $(this).addClass("current"); $('input#catagoryId').val($(this).attr("catavalue"));

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

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

ios-iOS中在类别中动态新增了的可变字典属性变成了不可变字典

问题描述 iOS中在类别中动态新增了的可变字典属性变成了不可变字典 想在category中新增个属性来用,创建的可变字典属性,也做了相关关联,结果用不了setobject方法,打印出来一看发现变成了不可变字典类型,希望有大神帮我看看哪里出问题了: static void *myAllPropertiesDicKey = &myAllPropertiesDicKey; @implementation FatherClass (Category) //add setter and getter me