在MVC4 asp.net中包含路径表达式错误

时间:2014-02-14 03:37:57

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

所以我正在尝试进行自定义登录。我有一个登录页面,我想检查用户名和密码是否与我的sql db匹配。尝试在文本框中输入用户名并将其与数据库中的用户名匹配时,我遇到了一个问题。我收到一条错误,指出 Include路径表达式必须引用该类型上定义的导航属性。使用虚线路径作为参考导航属性,使用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; }
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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