变量在方法之后设置为null

时间:2017-04-12 18:19:59

标签: c# asp.net-mvc-4 http-post

我正在建立一个网站,我需要显示一个客户列表。选择客户后,为了显示他的项目,我从视图中发送客户的ID:

 <th>
 @using (Html.BeginForm("SetID", "Client", FormMethod.Post, new 
{ id = item.id.ToString() }))
   {
    @Html.Hidden("id", item.id.ToString());
    <input type="submit" value="see items" />
   }
   </th>

我在控制器中收到了id并保存它以进行查询并以这种方式显示值。

private string customer_id
[HttpPost]
public ActionResult SetCustomer(string id) {
    Save(id);
    return RedirectToAction("Index");
}

private void Save(string id) {
    this.customer_id = id;
}

但是当我被重定向到Index视图时,变量&#34; customer_id&#34;,为null。我有什么遗失的吗?

2 个答案:

答案 0 :(得分:3)

因为你没有在任何地方保持价值。

HTTP 无状态。这在ASP.NET中意味着每个HTTP请求都会导致所请求的控制器的新实例。所以这里发生了以下事件序列:

  1. 用户向SetCustomer发出请求,创建该类的新实例
  2. 值存储在类级变量
  3. 请求被响应并完成,类的实例被销毁
  4. 用户向Index发出请求,创建该类的新实例
  5. 由于它是一个新实例,因此未设置任何值。您可以 存储数据的各种地方,它只需要在两个请求都可以访问的上下文中。示例没有特别的顺序,包括:

    1. 数据库
    2. 会话
    3. 网址查询字符串
    4. 曲奇
    5. 基本上,您必须将值写入某些位置,这些位置在请求之间保持不变。内存中的变量不会在Web应用程序中执行此操作。

      这里的一个简单示例可能是在重定向中包含查询字符串的值。在ASP.NET MVC中,可能看起来像这样:

      return RedirectToAction("Index", new { customer_id = id });
      

      这样做会在重定向用户时在URL参数中包含customer_id值。因此,您的Index操作可以接受该参数:

      ActionResult Index(int? customer_id = null)
      {
          // use the customer id if one is provided
      }
      

      在这种情况下,我假设在{<1}}被请求而没有值的情况下,该值应该是可为空的。但你喜欢做什么取决于你。基本上这个动作现在有一个可选参数,你可以使用它,但是你当前正试图使用​​它。

      这样做的好处是它可以保持Web应用程序的无状态性。您在请求/响应本身中存储状态(Index值),而不是您负责的其他媒介(会话,数据库等)保持它。

答案 1 :(得分:0)

ASP.NET MVC控制器被实例化以服务于每个请求。您的本地变量this.customer_id不应该在调用服务器后继续存在。如果你想保存一些东西,它应该放在数据库表,文件或某个持久的地方。

您也可以将其存储在内存中,就像在缓存中一样,但这需要引用一些比控制器更长的内容(在服务器响应浏览器后将被丢弃)。

如果你想要像我描述的那样长寿,你可能需要使用服务注入你的控制器。许多人会使用DI或IOC框架和生命周期配置来实现这一目标。