2

バックグラウンド:

私はMVCが初めてで、やり方を学んでいます。

私がやろうとしていること:

すべてのアクションでユーザー データを利用できるようにしようとしています。

どのように私はそれを達成しています:

これを実現するには、 OnActionExecuting関数でユーザー データを読み込みます。

私が遭遇した問題:

ユーザー データを保存する場所と、後で (アクション中に) データを取得する方法がわかりません。

現在のコード:

ここでは、現在のユーザーをロードしています。

    protected override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        UserAccount user = null;
        using (UsersContext db = new UsersContext()) {
            user = db.UserProfiles.FirstOrDefault(u => u.userName.ToLower() == User.Identity.Name.ToLower());
        }
    }

これらの場所で入手するにはどうすればよいですか?

    public ActionResult Default() {
        ViewBag.Message = user.userName;  // ????????????
        return View();
    }

考えられる解決策:

  1. パラメータに保存するだけです。
  2. ユーザー HttpContext (これがどのように機能するかわかりません。助けてください)。
  3. ユーザー ControllerContext (これがどのように機能するかわかりません。助けてください)。
  4. ビューステート?
  5. ビューバッグ?
  6. キャッシュ?
  7. 他のタイプの MVC マジック
4

1 に答える 1

3

コントローラーにそのような基本コントローラークラスを継承させるだけです

public class AccountController : BaseController

次に、BaseController で、ユーザーのデータを表すメソッドまたはプロパティを自由に作成できます。これらは、AccountController のすべてのアクションで使用できます。

public class BaseController : Controller
{
      public User CurrentUser
        {
            get
            {
                if (HttpContext.User == null || HttpContext.User.Identity.AuthenticationType != "Forms")
                    return null;
                if (Session["CurrentUser"] != null)
                    return (User)Session["CurrentUser"];
                var identity = HttpContext.User.Identity;
                var ticket = ((FormsIdentity)identity).Ticket;
                int userId;
                if (!int.TryParse(ticket.UserData, out userId)
                    return null;

                using (var db= new DbEntities(connectionString))
                {
                    Session["CurrentUser"] = db.Users.SingleOrDefault(u => u.ID == userId));
                }

                return (User)Session["CurrentUser"];
            }

        set { Session["CurrentUser"] = value; }
        }
}
于 2013-03-06T15:01:57.203 に答える