Asp.net mvc ';全球';state和ASP.netmvc

Asp.net mvc ';全球';state和ASP.netmvc,asp.net-mvc,Asp.net Mvc,我正在以非web开发人员的身份学习ASP.NET MVC。我正试图找到一个应用程序的最佳习惯用法,这个应用程序的概念是在影响所有其他页面的第一页上选择一个“项目” 似乎有三种选择: 只需将信息置于会话状态。工作正常,但不太符合MVC标准 将状态嵌入所有URL。。。因此,URL不是/Products/Details/1,而是全部/(project_id)/Products/Details/1 为此信息设置单独的cookie 由于应用程序中几乎所有的URL都需要当前项目,这似乎有些过分,并且使得

我正在以非web开发人员的身份学习ASP.NET MVC。我正试图找到一个应用程序的最佳习惯用法,这个应用程序的概念是在影响所有其他页面的第一页上选择一个“项目”

似乎有三种选择:

  • 只需将信息置于会话状态。工作正常,但不太符合MVC标准
  • 将状态嵌入所有URL。。。因此,URL不是/Products/Details/1,而是全部/(project_id)/Products/Details/1
  • 为此信息设置单独的cookie
由于应用程序中几乎所有的URL都需要当前项目,这似乎有些过分,并且使得构建任何视图中使用的URL的工作要多得多。它还需要我验证每个调用的权限,因为用户可以轻松地修改它


关于最佳方法的任何建议——使用会话是一个坏主意吗

就我个人而言,我只会使用这个会话。这个环节没有什么不符合MVCish的——把它看作是你模型的一部分


使用cookie实际上与使用会话没有什么不同。不过,将其嵌入到URL中并不是一个坏的选择,特别是对于“可链接性”,如果这是您的项目所关心的问题的话。但是它有一个副作用,那就是把URL弄得乱七八糟,需要你不断地在页面之间传递ID。

你的选项2是我的选择。
因此,不使用/Products/1/Details
我会把它做成项目/1/产品/1/细节

它只是更符合其余部分。它实际上与MVC无关,但是如果您希望您的路由和url像REST中的资源一样读取,那么您将希望url在斜杠处折叠并携带状态。其他方法是在cookie中标记一个项目id,但这会破坏链接,所以当有人离开并回来时,他们会被放回那里


会话还使您很难测试自己是否直接绑定到该概念。

会话的含义是什么?可伸缩性似乎是主要问题。任何服务器端状态都会影响应用程序的扩展能力。对于这个项目,我只是想更全面地理解MVC的“思维模式”。它是非MVC的,因为它并不真正符合MVC所认为的REST风格的URL。会话在默认情况下仅用于保存操作之间的错误消息。在任何情况下,使用它都会使测试更加困难。添加项目前缀是有意义的。对于测试,我不太确定。我可以很容易地在会话中模拟它,但是如果它是每个控制器方法调用上的一个参数,那么它也必须在那里传递更多。尽管如此,我还是会尝试一下这种方法,看看它在实践中是如何工作的。(不知道为什么会有人投反对票?)+1来自我。这是一个书签。会话和cookie不会。我尝试了这两种方法,使用URL路由效果很好。生成URL需要做更多的工作,但是使用通用的Html.ActionLink方法可以非常顺利地工作。链接能力的好处肯定大于麻烦。使用cookie保留了客户端的所有状态,因此理论上比会话更具可扩展性。但我认为这是最没有吸引力的方法,因为它会带来额外的服务器端验证的麻烦,而没有(正如您所指出的)获得可链接性的好处。