更新会话并在我的视图中使用它

时间:2014-12-19 21:38:35

标签: ajax asp.net-mvc session

我有一个愿望清单,即整个购物页面。我需要知道这是否有意义/正确的结构化方式。

将愿望清单存储为会话,当用户添加/删除新项目时,它会通过ajax调用更新会话,如果成功则返回true / false。在愿望清单组件的部分视图中,我检查会话并将其转换为我的viewModel(会话所基于的)或序列化它以进行淘汰。

如果这有意义,请告诉我,否则我可以发布一些代码示例

2 个答案:

答案 0 :(得分:2)

如果不了解您的基本结构,并且不了解您的确切需求,很难说。 我不知道你是否知道这一点,但你可以直接在Views中访问Session:

@{
var wishlist = (WishList)HttpContext.Current.Session["Wishlist"];
}

使用Ajax更新服务器端是可以的;然后你可以从控制器返回一个局部视图,然后在Ajax成功调用中使用你喜欢的。

我希望这是有道理的。

答案 1 :(得分:1)

首先,如果愿望清单仅在其访问期间存在,那么将其存储在会话中将是最好的事情。但是,如果愿望列表的寿命超过单次访问,​​并且应该在用户返回时可用,那么我建议将其存储在数据库中,以防止用户的凭据/帐户(假设他们有帐户)。

对于会话本身,虽然您可以从视图中访问会话数据,但我不建议您开始依赖会话,不久之后,您将会在您的视图中散布这样的代码。< / p>

var wishlist = (WishList)HttpContext.Current.Session["Wishlist"];

如果您想改变心愿单的工作方式,而是让数据库驱动,您现在想要保留心愿单,会发生什么?您必须浏览所有视图,更新对会话的引用。

相反,我会选择使用您选择的IoC容器注册会话并使用依赖注入注入它,这是一个如何使用StructureMap注册会话的简单示例:

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For<IUserWishlist>().HybridHttpOrThreadLocalScoped().Use(() => GetUserWishlistFromSession());   
    }

    public static IUserWishlist GetUserWishlistFromSession()
    {
        var session = HttpContext.Current.Session;
        if (session["WishList"] != null)
        {
            return session["WishList"] as IUserWishlist;
        }

        /* Create new empty session object */
        session["WishList"] = new UserWishlist();

        return session["WishList"] as IUserWishlist;
    }
}

现在,您可以将心愿单注入控制器,并通过视图模型将数据传递到视图中。而且,由于您现在正在针对接口而不是实现进行编程,因此您可以轻松更改心愿单的持久性,而无需更改引用心愿单的任何代码。

public class WishlistController : Controller {

    private readonly IUserWishlist userWishlist;

    public void WishlistController(IUserWishlist userWishlist) {
        this.userWishlist= userWishlist;
    }

    public ActionResult ViewProfile()
    {
        ...
        var viewModel = new UserWishlistViewModel {
            wishlist = this.userWishlist.GetWishList()
        }
        ...
    }
}

我在博客文章中写了一个更详细的例子,可能对can be read here感兴趣。我希望这有帮助!