我正在建立一个网站,我需要显示一个客户列表。选择客户后,为了显示他的项目,我从视图中发送客户的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。我有什么遗失的吗?
答案 0 :(得分:3)
因为你没有在任何地方保持价值。
HTTP 无状态。这在ASP.NET中意味着每个HTTP请求都会导致所请求的控制器的新实例。所以这里发生了以下事件序列:
SetCustomer
发出请求,创建该类的新实例Index
发出请求,创建该类的新实例由于它是一个新实例,因此未设置任何值。您可以 存储数据的各种地方,它只需要在两个请求都可以访问的上下文中。示例没有特别的顺序,包括:
基本上,您必须将值写入某些位置,这些位置在请求之间保持不变。内存中的变量不会在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框架和生命周期配置来实现这一目标。