ASP.NET MVC局部验证及相关问题

在上一篇“asp.net mvc常用的数据注解和验证以及entity framework数据映射”话题中,有的博友提到

‘“同一个实体在3-4个地方会发生修改,每个修改需要验证的方式都不一样,后端就不能写固定验证。”

此博友的言论我是很赞同的,在基于asp.net mvc上,我有对应的策略,并且,你只需几行代码,就解决了所有的事情。

还是举上次的Model,如下:

[Table("AdminInfo")]
    public partial class AdminInfo
    {
        [Key]
        [Display(Name = "编号:")]
        [Column("Id")]
        public int Id { get; set; }

        [Required(ErrorMessage = "*不能为空!")]
        [RegularExpression(@"^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$", ErrorMessage = "*6-18位拼音或数字")]
        [Column(TypeName = "nvarchar")]
        [MaxLength(50)]
        [Display(Name = "用户名:")]
        ///[Remote("CheckUserName","Account")]
        public string UserName { get; set; }

        [Required(ErrorMessage = "*不能为空!")]
        [RegularExpression(@"^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$", ErrorMessage = "*6-18位拼音或数字")]
        [Column(TypeName = "nvarchar")]
        [MaxLength(50)]
        [MinLength(6)]
        [Display(Name = "密码:")]
        [DataType(DataType.Password)]
        public string PassWord { get; set; }

        [Column(TypeName = "nvarchar")]
        [Display(Name = "真实姓名:")]
        [MaxLength(20)]
        public string TrueName { get; set; }

        [Display(Name = "是否可用:")]
        public bool? IsUseFul { get; set; }

        [ReadOnly(true)]
        [Display(Name = "创建时间:")]
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime CreatTime { get; set; }

        [Display(Name = "等级")]
        public int? Orders { get; set; }

        [NotMapped]
        [Required(ErrorMessage = "*不能为空!")]
        [RegularExpression(@"^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$", ErrorMessage = "*6-18位拼音或数字")]
        [Display(Name = "新密码")]
        [DataType(DataType.Password)]
        public virtual string PassWord1 { get; set; }

        [NotMapped]
        [Compare("PassWord1", ErrorMessage = "新密码和确认密码不一致!")]
        [Required(ErrorMessage = "*不能为空!")]
        [RegularExpression(@"^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$", ErrorMessage = "*6-18位拼音或数字")]
        [Display(Name = "确认密码")]
        [DataType(DataType.Password)]
        public virtual string PassWord2 { get; set; }
    }

在基于这个Model上,我们做一些业务,比如:添加,页面如下:

@{
    Layout = null;
}
@model SnsModels.AdminInfo

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <link href="/css/demo.css"  rel="stylesheet"/>
    <script type="text/javascript" src="/Scripts/jquery-1.7.2.min.js"></script>
    <script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
    <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
    <script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script>
</head>
<body>
    <div class="web">

        @using (Ajax.BeginForm("AddSubmit", "AdminInfo", new AjaxOptions { HttpMethod = "post" }))
        {
            <table class="table">
                <tr>
                    <td colspan="2" class="TableTitle">创建管理员</td>
                </tr>
                <tr>
                    <td>@Html.LabelFor(m => m.UserName)</td>
                    <td class="td2">@Html.TextBoxFor(m => m.UserName)</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td class="td2">@Html.ValidationMessageFor(m => m.UserName)</td>
                </tr>

                <tr>
                    <td>@Html.LabelFor(m => m.PassWord)</td>
                    <td class="td2">@Html.PasswordFor(m => m.PassWord)</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td class="td2">@Html.ValidationMessageFor(m => m.PassWord)</td>
                </tr>

                <tr>
                    <td>@Html.LabelFor(m => m.TrueName)</td>
                    <td class="td2">@Html.TextBoxFor(m => m.TrueName)</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td class="td2">@Html.ValidationMessageFor(m => m.TrueName)</td>
                </tr>

                <tr>
                    <td>&nbsp;</td>
                    <td class="td2">
                        <input type="submit" value="提交" /></td>
                </tr>
            </table>
        }
    </div>
</body>
</html>

在这里,我只用到了3个字段,但是Model上有很多字段,并且还有需要验证的字段,我们上面的业务中是没有显示出来的。

那么我们在控制器中做一些改动,如下:

[HttpPost]
        public ActionResult AddSubmit([Bind(Include = "UserName,PassWord,TrueName")] SnsModels.AdminInfo Model)
        {
            try
            {
                if (Request.IsAjaxRequest())
                {
                    ModelState.Remove("PassWord1");                    ModelState.Remove("PassWord2");
                    if (ModelState.IsValid)
                    {
                        if (Repository.Create<SnsModels.AdminInfo>(Model))
                        {
                            return JavaScript("alert(‘添加成功...‘);");
                        }
                        else
                        {
                            return JavaScript("alert(‘添加失败...‘);");
                        }
                    }
                    else
                    {
                        return JavaScript("alert(‘数据验证未通过...‘);");
                    }
                }
                else
                {
                    return Content("<script>alert(‘请求不通过...‘);window.location=‘/AdminInfo/Add‘;</script>");
                }
            }
            catch (Exception ex)
            {
                return JavaScript("alert(‘"+ex.Message.ToString()+"‘);");
            }
        }

ModelState.Remove("PassWord1");

ModelState.Remove("PassWord2");

上面2行,表示这字段,在本控制器中我们不需要验证。

然后我们体检Model到DAL层。如下:

/// <summary>
        /// 创建一条记录
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="model"></param>
        /// <returns></returns>
        public int Create<T>(T model) where T : class
        {
            int Result = 0;
            using (SnsLearningLogManagerDB db = new SnsLearningLogManagerDB())            {                db.Configuration.ValidateOnSaveEnabled = false;                db.Set<T>().Add(model);                Result = db.SaveChanges();                db.Configuration.ValidateOnSaveEnabled = true;                return Result;            }
        }
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.ValidateOnSaveEnabled = true;

这2个地方需要注意,如果没有,你插入的时候会一直显示操作异常。

在业务逻辑中我们已经验证过Model,在这里其实是不需要再进行验证的。

如果你一定要加上这个的话,我个人的解决方案是:新建一个ViewModel针对此业务逻辑,然后数据验证通过之后把ViewModel传递给Model,这样就搞定了。

在控制器层有一段这样的代码   [Bind(Include = "UserName,PassWord,TrueName")]这个是什么意思呢? 指定你的Model从View层接受到的属性,这个主要是防止攻击所用,因为别人可以仿造表单传递一些其他的参数进来,导致项目受损。比如:我在伪造一个表单,包含orders字段,次字段如果表示管理员身份的话,而0表示高级管理员,那么我直接给orders赋值0,这样传递到控制器上还是能验证通过的,这将导致往数据库插入错误数据。当然,我们有办法防止这些的,但是,加入[Bind(Include = "UserName,PassWord,TrueName")]如此简单,我们何乐不为呢!

本来也是菜鸟级别,如言论和代码有什么错误之处,还望大牛们指点。

自上次博客附带QQ群招人信息,不少博友都申请加入,小弟不慎感激。
以下为QQ群广告:
本群提供ASP.NET MVC,EF,LINQ,WEB API技术支持,不在乎人多,在乎人精。

ASP.NET MVC群 171560784  

诚邀各路高手、初学者加入。
 

ASP.NET MVC局部验证及相关问题,布布扣,bubuko.com

时间: 2024-12-05 15:51:48

ASP.NET MVC局部验证及相关问题的相关文章

【转】ASP.NET MVC 数据验证及相关内容

原文地址:http://www.jb51.net/article/56713.htm 一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验证相关的Html辅助方法在服务器端判断是否通过服务器端验证常用的验证标记 Required:非空验证StringLength:验证字符串的长度RegularExpression:正则表达式验证Compare:比较两个字段的值是否相等Range:范围验证Remote:服务器验证(需要在controll

ASP.NET MVC Model验证(二)

ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决 这个问题的,并且会描述一下ModelValidator类型对象相关的类型. Model验证 Model验证简单运用示例 ModelValidator使用生成过程 自定义实现DefaultModelBinder进行验证 自定义ModelValidatorProvider 和ModelValidator  Validation

ASP.NET MVC Model验证(三)

ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的Model验证是在哪个具体的方法中来执行的,本篇的主题就是模拟一下默认的实现,自定义个Model绑定器继承自DefaultModelBinder类型,并且重写某些个重要的方法. Model验证 Model验证简单运用示例 ModelValidator使用生成过程 自定义实现DefaultModelBi

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序更新相关数据 原文: Updating Related Data with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中您已经成功显示了相关数据.在本教程中

[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据

这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序读取相关数据 原文:Reading Related Data with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但您可以在您的网站上添加到该教程的链接. 在之前的教程中您已经完成了学校数据模型.在本教程中你将

ASP.NET MVC Model验证(一)

ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后面的篇幅中讲解MVC框架中Model验证的机制,以及一些Model验证的方式讲解,本章只是一个简单的示例篇幅,对于有基础的朋友可以直接跳过了(不能耽误大家时间). Model验证 Model验证简单运用示例 ModelValidator使用生成过程 自定义实现DefaultModelBinder进行

ASP.NET MVC Model验证(四)

ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而ModelValidator类型则是Model验证执行类型,在下面的示例中会使用Model验证提供程序结合Model验证执行类型来执行Model验证,就是使用上个篇幅中所讲的实现个Model绑定器继承自DefaultModelBinder类型,在自定义Model绑定器中使用ModelValidator类型

ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

原文:ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view) 在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie.cs文件,并添加高亮行如下所示: using System; using System.ComponentModel.DataAnnotations; using System.Data.

[转]ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie.cs文件,并添加高亮行如下所示: using System; using System.ComponentModel.DataAnnotations; using System.Data.Entity; namespace MvcMovie.Models { public class Movie