【问题标题】:validating a sql element exists in mvc c#验证 mvc c# 中是否存在 sql 元素
【发布时间】:2014-03-15 05:48:43
【问题描述】:

大家好,我正在尝试验证用户名是否存在于数据库中。我在检查数据库以查看该用户名是否存在时遇到问题。我已经进行了一些研究,但没有找到在 mvc 中执行此操作的正确方法(asp.net 和 mvc 的新手)。如果有人能指出我正确的方向,将不胜感激!

这是我的验证方法:

private bool isValid(string UserName, string Password)
        {
            bool isValid = false;

                var user = db.User.Where(u => u.UserName == UserName);

                if (user != null)
                {
                    isValid = true;
                }

                return isValid;
        }

到目前为止,它允许任何人登录,即使他们不在数据库中。

【问题讨论】:

  • 您不想检查密码吗?
  • 是的,现在正在处理用户名,但还需要输入密码。这个人一步一步;)
  • 仅供参考 Where() 永远不会返回 null。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 login


【解决方案1】:

一种比您使用的更简洁的方法是利用.Any() LINQ 方法。这样,您也不需要跟踪 IsValid 变量。

private bool isValid(string UserName, string Password)
   {
        //returns true if there is any match, false if no match
        return db.User.Any(u=> u.UserName == UserName);   
   }

此外,如果您确实想检索用户以对 User 对象执行其他操作,您可以使用快捷方式 .Where() 并简单地使用 .FirstOrDefault() 代替 where 子句。

private bool isValid(string UserName, string Password)
   {
        var user = db.User.FirstOrDefault(u=> u.UserName == UserName);
        //return true if user is not null, false if user is null   
        return user != null   
   }

【讨论】:

    【解决方案2】:

    您可以使用远程验证:

    验证控制器:

    [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
    public class ValidationController : ControllerBaseNoAuthorize
    {
        public JsonResult IsNameAlreadyInUse([Bind(Prefix = "User.Name")]string Name)
        {
            return NameAlreadyInUse(Name);
        }
    
        protected JsonResult NameAlreadyInUse(string name)
        {
            vvar user = db.User.FirstOrDefault(u => u.UserName == UserName);
            if (user == null)
                return Json(true, JsonRequestBehavior.AllowGet);
        }
        }
    

    型号:

    public class ModelRegistrationModel
    {
        [Required]
        public int Id{ get; set; }
    
        [Required]
        [Remote("IsNameAlreadyInUse", "Validation", areaName: "AreaName")]
        public string Name { get; set; }
    }
    

    【讨论】:

      【解决方案3】:

      试试

      var user = db.User.Where(u => u.UserName == UserName).FirstOrDefault();
      

      【讨论】:

      • 工作得很好,计时器到时将标记为答案。现在只需匹配密码:)。感谢您的帮助,非常感谢。
      • 只是为了解释,没有FirstOrDefault,你总是返回一个IEnumerable,有时记录为零,有时记录为1,但绝不为null。
      • 您可以考虑使用 SingleOrDefault 而不是 FirstorDefault。它声明了数据库中单个项目的假设(因此它更具可读性)并检查重复项(如果有的话将引发异常),尽管可能会慢一些(它必须遍历所有项目)。不过我还是建议改用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2010-12-09
      • 1970-01-01
      • 2015-02-02
      • 2018-11-15
      • 2023-04-08
      相关资源
      最近更新 更多