所以我正在尝试进行自定义登录。我有一个登录页面,我想检查用户名和密码是否与我的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; }
}
}
答案 0 :(得分:1)
您不需要在此处使用Include,因为Include方法是获取导航属性。如果您的目的是确定现有用户,请使用“.Where”或“.Find”。
编辑:“.Find”方法需要使用主键来查询dbcontext。如果在上下文中找到对象,则不会往返数据库。使用“。Where”将匹配您传递给方法的任何谓词。
答案 1 :(得分:1)
您的查询不正确。 .Include()
方法用于检索模型上的导航属性。您收到的错误消息表明了这一点,尽管有点令人困惑。要检索单个用户,请使用:
var user = db.user.SingleOrDefault(u => u.UserName == UserName);
在这种情况下,如果数据库中不存在具有指定用户名的用户,则user
将为null。