我有一个愿望清单,即整个购物页面。我需要知道这是否有意义/正确的结构化方式。
将愿望清单存储为会话,当用户添加/删除新项目时,它会通过ajax调用更新会话,如果成功则返回true / false。在愿望清单组件的部分视图中,我检查会话并将其转换为我的viewModel(会话所基于的)或序列化它以进行淘汰。
如果这有意义,请告诉我,否则我可以发布一些代码示例
答案 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感兴趣。我希望这有帮助!