MVC:将数据放入缓存或会话是否属于控制器?

时间:2013-04-28 06:58:14

标签: asp.net-mvc asp.net-mvc-4

如果将信息保存到下面的会话代码,属于控制器操作,如下所示,或者它应该是我的模型的一部分,我有点困惑?

我想补充一点,我有其他控制器方法,以后会读取这个会话值。

  public ActionResult AddFriend(FriendsContext viewModel)
  {
        if (!ModelState.IsValid)
        {                
            return View(viewModel);
        }

        // Start - Confused if the code block below belongs in Controller?

        Friend friend = new Friend();
        friend.FirstName = viewModel.FirstName;
        friend.LastName = viewModel.LastName;
        friend.Email = viewModel.UserEmail;            

        httpContext.Session["latest-friend"] = friend;

        // End Confusion

        return RedirectToAction("Home");
    }

我想在我的模型中添加一个静态实用程序类,它执行类似下面的操作,但在另一个文件中添加2行代码似乎很愚蠢。

public static void SaveLatestFriend(Friend friend, HttpContextBase httpContext)
{
    httpContext.Session["latest-friend"] = friend;
}


public static Friend GetLatestFriend(HttpContextBase httpContext)
{
    return httpContext.Session["latest-friend"] as Friend;
}

2 个答案:

答案 0 :(得分:1)

我不会过分担心您将代码保存到会话的位置。这是一行代码,因此您不会通过提取任何内容来保存任何内容或使其更清晰。

为了创建你的朋友对象,我个人会使用像Automapper这样的东西,或者在我的视图模型上有一个填充方法。

var friend = viewModel.Populate(new Friend());

public void Populate(Friend friend) 
{
    friend.FirstName = this.FirstName;
}

至于将朋友保存到会话中,如果你想提取它,我会做类似于你的静态方法但作为会话扩展方法。只是因为它可以立即清楚存储它的位置。

// set
Session.LatestFriend(friend);

// get
var latestFriend = Session.LatestFriend();

答案 1 :(得分:0)

Controller是存储和获取数据的正确位置,并使用该数据填充模型。 模型用作支持在视图中显示的数据。

所以你正在做的事情非常正确。

不需要从Session获取或存储的静态类,因为它只涉及一行代码。

在处理多个字段初始化时,

为Bigfellahull的建议+1。