【问题标题】:Pro's & cons to pass data in a project in asp.net MVC在 asp.net MVC 项目中传递数据的利弊
【发布时间】:2015-03-24 22:33:21
【问题描述】:

所以我想知道,在项目的页面之间传递数据的各种方式的优缺点是什么。

我知道:

  1. Sessions:我不能使用它,因为我的项目需要部署在 Azure 之类的平台上,Sessions 不适合多服务器部署。
  2. 在各种 actionresults 之间传递参数:这很好用,但这样做可能非常乏味...
  3. Cookie:我打算在我的项目中使用它,但我了解到这不是最佳做法?

所以我想知道你们正在使用什么技术(以及为什么),所以我可以决定我将使用什么技术。

例如:我的用户已登录并且对于几个 ActionResults 我需要 UserId 来访问 userRepository,最好的方法是什么。或者甚至有一种将用户作为对象的好方法(这样我就不必一直访问数据库了)?我已经建立了一个登录系统并且它工作正常,但是用户没有被存储在某个地方吗?还是只存储用户的一些数据?例如,我正在使用它:

FormsAuthentication.SetAuthCookie(user.Email, false);

提前致谢!

【问题讨论】:

  • 您可以在 Windows Azure 上使用会话状态,但由于它是进程外的,这意味着所有会话状态对象都必须是可序列化的。
  • 另外,我们在谈论什么样的数据?您将根据上下文使用每个建议的选项,您不能将一个替换为另一个,例如,对大量数据使用 cookie 或 URI 参数是完全不合适的。
  • 我说的是简单的变量,比如用户名等。
  • 这取决于你想做什么,你能举个例子吗?
  • Burt 我在 Op. 中添加了一个示例

标签: c# asp.net-mvc parameter-passing


【解决方案1】:

传递用户名听起来很像身份验证。看看 ASP Membership https://msdn.microsoft.com/en-us/library/yh26yfzy(v=vs.140).aspx

根据您的要求,您还可以查看 TempData,尽管这仅对在操作之间进行重定向非常有用。 Using Tempdata in ASP.NET MVC - Best practice

编辑 - 基于您使用授权 cookie 的事实,您应该考虑 MVC 授权属性https://msdn.microsoft.cohm/en-us/library/system.web.mvc.authorizeattribute%28v=vs.118%29.aspx

或者另一种好方法是使用处理您的授权的基本控制器类

 public BaseController: Controller
 {
       protected string username ;

       protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
           // Do authorization here
          username = // code to get username 
   {
 }

【讨论】:

  • 是的,TempData 并不真正适合我的意思。那个Membership的东西,我已经有登录系统了,看看我添加的那行代码。
  • 那么我想你已经回答了你自己的问题。您应该将 cookie 用于您的所有授权操作。
  • 所以我可以使用 'User loggedInUser = AuthorizeAttribute.Users' 来获取当前登录的用户?
  • AuthorizeAttribute 实际上是基于 ASP Membership,但您可以按照类似的思路编写自己的过滤器属性。
【解决方案2】:

会话:
优点:很好很容易
缺点:吃掉内存

参数:
优点:它的形式是“意味着”工作的方式
缺点:您最终可能会传递很多东西或在服务器上重做工作

饼干:
优点:从客户端和服务器访问
缺点:他们有怪癖,尤其是在服务器端处理它们并将它们传回时。具有锁定问题的有效全局变量

我的电话:参数。你总是可以有一个大的 json blob

【讨论】:

  • 在什么情况下会使用 json blob?
  • 假设您有一个页面,其中包含选定项目的列表,您可以编辑它们等然后保存它们。您可以拥有一个包含多个字段的表单,这些字段都经过精心命名。或者您可以创建一个包含所有数据的 json 对象,该对象与您的视图模型相匹配,并通过 ajax 发送回
  • 您用作示例的用户名不是一个很好的示例。您应该生成一个身份验证令牌并将其传递到标头或其他一些疯狂的东西中
  • 您将问题与身份验证混淆了。问题 1:如何通过回发保留数据。问题2:身份验证,一种特殊情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
相关资源
最近更新 更多