如何检测哪个用户点击了链接MVC3成员资格

时间:2012-04-26 20:14:48

标签: database string asp.net-mvc-3 lambda

当用户单击链接时,此方法获取用户标识和其他数据并将其写入数据库。我似乎找不到跟踪用户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);
    }

1 个答案:

答案 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例外的原因。删除该参数,看看是否有任何不同的结果。