0

ログイン後にASP.NET MVC 4でユーザー名を渡そうとしていますが、データを転送する方法がわかりません。

これは、設定後にユーザー情報を取得する「Auth」という名前のログイン アクションです。

public string name;
account userInfo;

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Auth(account user)
{
    if (ModelState.IsValid)
    {
        userInfo = GetUser(user);
        if (userInfo.rank == "a")
        {
            Session["IsAdmin"] = true;
            Session["IsMember"] = true;
            name = userInfo.username;
            return RedirectToAction("Index", "Mod");
        }
        if (userInfo.rank == "member")
        {
            Session["IsMember"] = true;
            name = userInfo.username;
            return RedirectToAction("Index", "Post");
        }
    }

    name = userInfo.username;
    return View("Login");
}

name 変数が設定された後、継承を使用して表示するサイトのインデックスである PostController の Index View から値を取得しようとしましたが、変数は null にリセットされます。 AccountController から name 変数を呼び出すために使用される Index アクションは次のとおりです。認証アクションが存在する場所。

    public class PostController : AccountController
    {
        public ActionResult Index(int? id)
        {

          /*EncryptConString();*/
            int pageNum = id ?? 0;
            IEnumerable<Post> posts = 
                (from post in db.Posts
                where post.time < DateTime.Now && post.category == "Blog Post"
                orderby post.time descending
                select post).Skip(pageNum * postCount).Take(postCount +1);

            ViewBag.IsPreviousLinkVisible = pageNum > 0;
            ViewBag.IsNextLinkVisible = posts.Count() > postCount;
            ViewBag.PageNumber = pageNum;
            Session["ShowSide"] = true;
            ViewBag.showSidebar = showSidePanel;
            ViewBag.SecAbvPosts = secAbvPosts;
            ViewBag.IsAdmin = IsAdmin;
            ViewBag.IsMember = IsMember;
            ViewBag.Name = name;
            return View(posts.Take(postCount));
        }
    }

これを行う別の方法はありますか?ログイン後にユーザー情報を取得して、プロフィール写真とともにインデックスページに表示しようとしています。助けてください!!

4

4 に答える 4

1

リダイレクトの結果としてコントローラ クラスの新しいインスタンスが作成されるため、リダイレクト後に値を使用することはできません。リダイレクト間でデータが保持されることはありません。

あるオプションの 1 つは、TempData を一時ストレージとして使用することです。これは、あるリクエストから次のリクエストに渡すのに十分な長さです。セッションに支えられていますが、寿命ははるかに限られています。詳細はこちら: ASP.NET MVC での Tempdata の使用 - ベスト プラクティス

ただし、覚えておくべきことの 1 つは、すべてのリクエストで同じサーバーをヒットすることに依存しているため、負荷分散されたシステムではセッションベースのものが常にうまく機能するとは限らないということです。通常、session は控えめに使用することをお勧めします。多くの場合、実際には 2 番目のアクション メソッドで DB からユーザー レコードをリロードする方が簡単です。

于 2013-07-25T02:38:53.397 に答える
1

AControllerは Web リクエストの間だけ持続します。彼らがログインしたら..そのコントローラーは完了です。次のコントローラーは、まったく新しいインスタンスで起動します..そして、起動すると、name(ご覧のnullとおり)になります。

あなたのセットアップ全体は非常に奇妙で、ベストプラクティスに反しています。私が言いたいのは、新しいリクエストでユーザー情報を再度取得する必要があるということです。ただし、現在の設定でユーザーを特定する方法は別の問題です。ユーザー名も保存できますSession..しかし、実際には、Membership.NETによって提供されるクラスを使用するか、少なくともプロパティを介して取得できるCookieでサインインする必要がありHttpContext.Current.Identityます。そうすれば、名前でそれらを識別し、それらの詳細を再度取得できます。

また、注意してください:強く型付けされたモデルとdynamic型付け ( ) を混在させています。ViewBag1 つ選んでください (厳密に型指定されていることが推奨/ベスト プラクティスです)。

于 2013-07-25T02:40:03.903 に答える
0

継承を使用してこれを達成できるとは思いません。AccountController は親タイプですが、インスタンス化される実際のオブジェクトは、http リクエストがそのルートを移動するにつれて異なります。PostController にリダイレクトすると、PostController は、2 つの異なる静的型を持つ同じオブジェクトではなく、AccountController とはまったく異なるオブジェクトになります。

名前を TempData にチャックし、リダイレクトされたターゲット アクションでそこから取得することができます。

于 2013-07-25T02:45:58.460 に答える