1

ユーザーがリンクをクリックすると、このメソッドはユーザーIDとその他のデータを取得し、それをデータベースに書き込みます。IDは自動的に生成されるため、ユーザーIDを追跡する方法が見つからないようです。

私は自分のベースとは別にメンバーシップベースを使用しています。userIDを見つけるために、私はUserName文字列を比較しようとしていました。このエラーが発生します:「現在のWebリクエストの実行中に未処理の例外が生成されました。」また、「抽象クラスを作成できません。」 2つのデータベースから2つの文字列を比較するためのより良い方法はありますか?それとももっと良い方法はありますか?ラムダ式を使用するのはこれが初めてです。

Where()の代わりにSingle()とFirst()を使用しようとしましたが、それでも同じエラーが発生します。

[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);
    }
4

1 に答える 1

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例外の原因です。そのパラメータを削除して、別の結果が得られるかどうかを確認してください。

于 2012-04-26T20:21:03.597 に答える