gpt4 book ai didi

c# - 方法后变量设置为空

转载 作者:太空狗 更新时间:2023-10-30 01:30:45 26 4
gpt4 key购买 nike

我正在构建一个网站,我需要显示一个客户列表。选择客户后,为了显示他的项目,我从 View 中发送客户的 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>

我在 Controller 中收到 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;
}

但是当我被重定向到索引 View 时,变量“customer_id”为空。有什么我想念的吗?

最佳答案

因为您没有在任何地方保留值。

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

  1. 用户向 SetCustomer 发出请求,创建该类的新实例
  2. 值存储在类级变量中
  3. 请求响应完成,类实例销毁
  4. 用户向 Index 发出请求,创建该类的新实例

因为它是一个新实例,所以没有设置任何值。您可以存储数据的地方有很多种,但它必须位于两个请求都可以访问的上下文中。示例(排名不分先后)包括:

  1. 数据库
  2. session
  3. URL 查询字符串
  4. cookies
  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
}

在这种情况下,我假设该值应该可以为空,以防Index 被请求时 没有值。但是您愿意为此做什么取决于您。基本上,此操作现在有一个可选参数,您可以在当前尝试使用它时使用它。

这样做的好处是它保持了 Web 应用程序的预期无状态性。您将状态(customer_id 值)存储在请求/响应本身中,而不是您负责的其他媒介( session 、数据库等)维护它。

关于c# - 方法后变量设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43376877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com