【问题标题】:Include path expression error in MVC4 asp.net在 MVC4 asp.net 中包含路径表达式错误
【发布时间】:2014-03-13 06:49:57
【问题描述】:

所以我正在尝试进行自定义登录。我有一个登录页面,我想检查用户名和密码是否与我的 sql 数据库匹配。尝试在文本框中提取用户名并将其与数据库中的用户名匹配时遇到问题。我收到一条错误消息,提示 包含路径表达式必须引用在类型上定义的导航属性。对参考导航属性使用虚线路径,对集合导航属性使用 Select 运算符。这是什么意思?

这是我的用户控制器:

[HttpGet]
        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(Models.User user)
        {
            if (ModelState.IsValid)
            {
                if (IsValid(user.UserName, user.Password))
                {
                    FormsAuthentication.SetAuthCookie(user.UserName, false);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", "Login Data is incorrect");
                }
            }

            return View(user);
        }

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

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

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

                return isValid;
        }

错误在于 var user = db.User.Include(u => u.UserName == UserName);

这是我的cshtml:

@model MyApp.Models.User

@{
    ViewBag.Title = "Login";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Login Failed.  Check your login details.");
    <div>
        <fieldset>
            <legend>Login Form</legend>
            <div>@Html.LabelFor(u=>u.UserName)</div>
            <div>@Html.TextBoxFor(u => u.UserName)
                @Html.ValidationMessageFor(u => u.UserName)
            </div>

            <div>@Html.LabelFor(u => u.Password)</div>
            <div>
                @Html.PasswordFor(u => u.Password)
            @Html.ValidationMessageFor(u => u.Password)
        </div>
            <input type="Submit" value="Log In" />
        </fieldset>
    </div>
}

这是用户模型:

public class User
    {
        [Key]
        public int UserId { get; set; }

        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }

        [Required]
        [StringLength(20, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }
    }
}

【问题讨论】:

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


    【解决方案1】:

    您不需要在此处使用 Include,因为 Include 方法是获取导航属性。如果您的目的只是确定现有用户,请使用“.Where”或“.Find”。

    编辑:“.Find”方法需要使用主键来查询dbcontext。如果在上下文中找到您的对象,则不会往返您的数据库。使用 ".Where" 将匹配您传递给方法的任何谓词。

    【讨论】:

      【解决方案2】:

      您的查询不正确。 .Include() 方法用于检索模型上的导航属性。您收到的错误消息表明了这一点,尽管方式有些混乱。要检索单个用户,请使用:

      var user = db.user.SingleOrDefault(u => u.UserName == UserName);
      

      在这种情况下,如果数据库中不存在具有指定用户名的用户,user 将为 null。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 2011-04-18
        相关资源
        最近更新 更多