zoukankan      html  css  js  c++  java
  • 解决MVC中检查用户名是否存在的问题

    一、实现检测用户名是否已存在。

    解决方法如下:

    1、字段上加上[Remote("CheckUserName", "User", ErrorMessage = "用户名已经存在")],第一个参数是Action,第二个是Controller,第三个是验证提示的消息。

            [Required]
            [MaxWordsExpression(50)]
            [Remote("CheckUserName", "User", ErrorMessage = "用户名已经存在")]
            [Display(Name = "帐号")]
            public string UserName { get; set; }

    2、在相应的Action里写入验证代码

            [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]   //清除缓存
            public ActionResult CheckUserName(string UserName)
            {
                var result = m_BLL.GetByUserName(UserName);
                return Json(result, JsonRequestBehavior.AllowGet);
            }
            public bool GetByUserName(string userName)
            {
                var result = false;
                IQueryable<JxUser> queryData = null;
                if (!string.IsNullOrWhiteSpace(userName))
                {
                    queryData = m_Rep.GetList(db).Where(a => a.JXName.Equals(userName));
                    result= queryData.Count() >= 1 ? false : true;
                }
               
                return result;
            }

    这里需要注意的有三点:

    a)如果注册完成后,如果你直接点浏览器后退,就能绕开这个验证机制,因为验证通过这个过程被缓存起来了。这里需要清除缓存。

    b)参数名需要和字段名一致

    c)返回的值是Json(result, JsonRequestBehavior.AllowGet);

    这样就能检测UserName是否在库里已存在。

    二、登录时候提示用户名存在

    注册时候验证是否用户名已存在已完美解决,但在登录的时候该属性会提示用户名已存在(:-D 当然存在了,已经注册成功!),明显不合理。

    解决方法有3种:

    1、另建一个Model用来承载Login的数据。这个没去实现,不中意这种解决方案。

    2、修改之前代码,登录的时候判断,如果是登录就不进行验证。代码修改如下:

    验证的Action方法

           [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]   //清除缓存
            public ActionResult CheckUserName(string UserName,string UserId)
            {
               var result = true;
                if (string.IsNullOrWhiteSpace(UserId))//判断是否为空,为空为注册
                {
                    result = m_BLL.GetByUserName(UserName);
                }
                return Json(result, JsonRequestBehavior.AllowGet);
            }


    实体属性相应修改:

            [Required]
            [MaxWordsExpression(50)]
            [Remote("CheckUserName", "User", AdditionalFields = "UserId", ErrorMessage = "用户名已经存在")]
            [Display(Name = "帐号")]
            public string UserName { get; set; }

    3、去掉Remote验证,在Action里添加调用方法判断,用ModelState.AddModelError添加Error信息。

    三、修改时候提示用户名已存在

    如果不是登录功能,而是修改模块,这时候账号是可以修改的。这时候传入UserId就不适用了。

    分两种情况,一种是账号没修改过,这时候不做判断;一种是已修改,需要进行判断。

    这里用了一个冗余字段UserNamePre,记录修改前的账号,用于比较。

    具体代码如下:

    1、添加实体字段:

     [Display(Name = "曾经帐号")]
     public string UserNamePre { get; set; }

    2、修改UserName

            [Required]
            [MaxWordsExpression(50)]
            [Remote("CheckUserName", "User", AdditionalFields = "UserNamePre", ErrorMessage = "用户名已经存在")]
            [Display(Name = "帐号")]
            public string UserName { get; set; }

    3、修改相应Action

            [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]   //清除缓存
            public ActionResult CheckUserName(string UesrName,string UserNamePre)
            {
               var result = true;
                if (UserNamePre != UserName)
                {
                    result =  m_BLL.GetByUserName(UserName);
                }
                return Json(result, JsonRequestBehavior.AllowGet);
            }


    当前前台需要添加    @Html.HiddenFor(model => model.UserNamePre),否则后台取得值回事undifined。


    以上是个人遇到问题中解决方法的一些思路,限于个人能力有限,还存在更好的方法和优化方法,望大家教我。

  • 相关阅读:
    关于hibernate的实体类中有集合类型转化成JSON的工具类
    关于hibernate的实体类中有集合类型转化成JSON的工具类
    浏览器九宫格的简单实现
    小米1S MIUI V5刷回V4教程
    新婚常用祝贺词
    【转】spring3 MVC实战,手工搭建Spring3项目demo
    Java8的日期时间处理
    穷达自有天命 无事多读好书
    [oracle/sql]求员工表中每个部门里薪水最高的员工,那种sql最优?
    [Java]取得当前代码所在函数的函数名
  • 原文地址:https://www.cnblogs.com/GallopingSnail/p/5929585.html
Copyright © 2011-2022 走看看