0

我正在尝试为我的会话实现一个包装器(松散耦合,因此以后很容易进行更改)但我遇到了问题,要么存储到会话中失败,要么检索但我不知道是哪个。

如果您能查看我的代码并告诉我是否有任何明显错误,或者有更好的方法来做我想做的事情,我将不胜感激。我基本上想向不同类型的用户显示不同的东西,但是当我尝试在 ViewContext 中访问用户时,它为空。

我们将不胜感激地接受任何指向教程或示例的链接。

这是我的代码:

  • 用户和 WEB_USER_LEVEL 有一对多的关系
  • 我已经使用实体框架从我现有的数据库中创建模型
  • 我目前处于项目的早期阶段,用户还没有来自数据库(因为结构会改变),所以我正在创建一个新用户并在使用 CurrentUserService.Login(user) 之前填充它。我尝试将用户从数据库中拉出并登录该用户,但它仍然无法正常工作。

ICurrentUserService.cs(在 Infrastructure 文件夹中)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyProject.Infrastructure
{
    public interface ICurrentUserService
    {
        User CurrentUser { get; }
        void SetCurrentUser(WEB_USER user);
        void SetAdminStatus(bool type);
        bool GetAdminStatus { get; }
        void SetManagerStatus(bool type);
        bool GetManagerStatus { get; }
        void Login(User user);
        void Logout();
        int? TryGetCurrentUserId();
    }
}

CurrentUserService.cs(在 Infrastructure 文件夹中)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MyProject.Controllers;
using MyProject.Infrastructure.Filters;

namespace MyProject.Infrastructure
{    

    public class CurrentUserService : ICurrentUserService
    {        
        public const string CurrentUserKey = "CurrentUser";
        public const string CurrentUserIdKey = "CurrentUserId";
        public const string IsAdminKey = "IsAdmin";
        public const string IsManagerKey = "IsManager";

        private readonly IDb _db;

        public CurrentUserService() : this(new Db()) { }

        public CurrentUserService(IDb db)
        {
            _db = db;
        }

        public User CurrentUser
        {
            get
            {
                return (User)HttpContext.Current.Items[CurrentUserKey];
            }
        }

        public void SetCurrentUser(User user)
        {
            HttpContext.Current.Items[CurrentUserKey] = user;
        }

        public void SetAdminStatus(bool type)
        {
            HttpContext.Current.Session[IsAdminKey] = type;
        }

        public bool GetAdminStatus
        {
            get { return (bool)HttpContext.Current.Session[IsAdminKey]; }
        }

        public void SetManagerStatus(bool type)
        {
            HttpContext.Current.Session[IsManagerKey] = type;
        }

        public bool GetManagerStatus
        {
            get { return (bool)HttpContext.Current.Session[IsManagerKey]; }
        }            

        public void Login(User user)
        {
            HttpContext.Current.Session[CurrentUserIdKey] = user.ID;
            HttpContext.Current.Items[CurrentUserKey] = user;
            SetManagerStatus(user.WEB_USER_LEVEL.IsManager);
            SetAdminStatus(user.WEB_USER_LEVEL.RefID == 1 ? true : false);
        }

        public void Logout()
        {
            HttpContext.Current.Items[CurrentUserKey] = null;
            HttpContext.Current.Session[CurrentUserIdKey] = null;
            SetManagerStatus(false);
            SetAdminStatus(false);
        }

        public int? TryGetCurrentUserId()
        {
            return HttpContext.Current.Session[CurrentUserIdKey] as int?;
        }
    }
}

Extensions.cs(在 Infrastructure 文件夹中)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MyProject.Infrastructure
{
    public static class Extensions
    {
        public static User CurrentUser(this ViewContext view)
        {
            return (User)view.HttpContext.Items[CurrentUserService.CurrentUserKey];
        }
    }
}

家庭控制器.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyProject.Infrastructure;
using MyProject.Infrastructure.Filters;
using MyProject.ViewModels;
using MyProject.Models;
using System.Data.Objects;

namespace MyProject.Controllers
{    

    public class HomeController : BaseController
    {
        readonly IDb _db;
        readonly ICurrentUserService _currentUserService;
        readonly IErrorReporter _errorReporter;

        public HomeController() : this(new Db(), new CurrentUserService(), new ErrorReporter()) { }

        public HomeController(IDb db, ICurrentUserService currentUserService, IErrorReporter errorReporter)
        {
            _db = db;
            _currentUserService = currentUserService;
            _errorReporter = errorReporter;
        }

        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(FormCollection form)
        {
            // Create new user and populate
            _currentUserService.Login(user);
            return RedirectToAction("Home");
        }

        public ActionResult Home()
        {
            return View();
        }
    }
}

加载 Home 视图时尝试在 _Layout.cshtml 中的 ViewContext 中访问

@using MyProject.Infrastructure

@if (ViewContext.CurrentUser() != null && ViewContext.CurrentUser().WEB_USER_LEVEL.IsManager) 
{
    @RenderPage("~/Views/Shared/_Menu.cshtml")
}

但 ViewContext.CurrentUser() 始终为空。

谢谢您的帮助!

4

1 回答 1

0

我建议您为视图创建一个 ViewModel 并将视图所需的数据传递给它,而不是在 ViewContext 之上创建扩展方法。请记住,视图需要的任何外部数据都应通过 ViewModel 输入。这使得一个干净的一对一的关系很容易遵循。

于 2013-05-22T22:13:00.667 回答