当用户单击链接时,此方法获取用户标识和其他数据并将其写入数据库。我似乎找不到跟踪用户ID的方法,因为id是自动生成的。
我与我的基地分开使用会员基础。为了找到userID,我试图比较UserName字符串。 我收到此错误:“在执行当前Web请求期间生成了未处理的异常。”另外“不能创建一个抽象类。” 是否有更好的方法来比较两个数据库中的两个字符串?或者,还有更好的方法?这是我第一次使用lambda表达式。
我尝试使用Single()和First()而不是Where(),但我仍然得到相同的错误。
[HttpPost]
public ActionResult AddToList(Review review, int id, HttpContextBase context)
{
try
{
if (ModelState.IsValid)
{
//User user = new User();
//user.UserID = db.Users.Where(c => c.UserName == context.User.Identity.Name);
User user = new User();
Movie movie = db.Movies.Find(id);
review.MovieID = movie.MovieID;
string username = context.User.Identity.Name;
user = (User)db.Users.Where(p => p.UserName.Equals(username));
review.UserID = user.UserID;
db.Reviews.Add(review);
db.SaveChanges();
return RedirectToAction("Index");
};
}
catch (DataException)
{
//Log the error (add a variable name after DataException)
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
}
return View(review);
}
答案 0 :(得分:1)
你的问题可能就在这一行:
user = (User)db.Users.Where(p => p.UserName.Equals(username));
Where()
扩展方法返回IEnumerable,而不是单个实例,因此每次隐式转换都会失败。您要找的是First()
或FirstOrDefault()
。如果没有匹配,First()
将抛出异常,而如果找不到匹配,FirstOrDefault()
将返回null。该行应该是:
user = db.Users.First(p => p.UserName.Equals(username));
你可能有比这更大的问题,但这是你当前错误的原因。
进一步查看代码后,您需要在动作结果调用中请求HttpContextBase。你永远不会使用它,它可能是Cannot create an abstract class
例外的原因。删除该参数,看看是否有任何不同的结果。