在我的控制器类中,我在哪里保存与页面关联的变量
本文关键字:关联 变量 保存 在哪里 控制器 我的 | 更新日期: 2023-09-27 18:33:40
请允许我更详细地解释我的情况。我有一个控制器,例如
public class AnswersController : Controller
{
// ...
private Guid _Pid;
// ...
[HttpGet]
public ActionResult FillOut ( Guid pid )
{
this._Pid = pid;
// ...
}
// ...
}
这是我尝试存储与FillOut
调用的视图关联的变量_Pid
,以便当来自视图的 AJAX 调用调用控制器上使用该变量的另一个方法
[HttpPost]
public ActionResult SubmitAnswers ( List<AnswerSubmission> Answers )
{
// ...
this._Db.SubmitAnswers(Answers, this._Pid);
我把它放在那里,而不是把它传递到页面并发回去。但这会导致由于未设置this._Pid
而导致错误。
我的推理缺陷在哪里?是否需要将此变量传递给视图?我认为控制器的新实例与页面相关联。
推理中的缺陷是,对服务器的每个查询都会创建一个新的控制器,因此每次_Pid都是空的。
你有一个不错的选择,也是一个快速而肮脏的选择:将数据存储在物理存储(文件、数据库等(中,或者将属性设为静态,它将在所有实例之间共享。
但请注意,静态字段可能会被清空,因为服务器可以卸载 AppDomain。
将 _Pid 的值传递给 View,然后将其用作 ajax 请求中的参数。 ASP.NET MVC 为每个请求创建控制器的新对象(带有 init 值(。
Http 是无状态的!这意味着,你对代码发出的每个 http 请求都不知道你之前的 http 请求发生了什么。因此,当您进行第二次 ajax 调用时,第二个请求将创建控制器的全新对象并初始化变量。
您应该做的是将 Guid 值传递回视图,并在进行 ajax 调用时再次使用它。为此,您可以为网页视图模型添加新属性。
public class FillOutVm
{
public Guid Pid { set;get;}
//Other properties
}
,然后在 Get 操作中设置此属性值。
[HttpGet]
public ActionResult FillOut ( Guid pid )
{
var vm= new FillOutVm { Pid=pid };
return View(vm);
}
在强类型到此视图模型的视图中,您可以将此值保留在隐藏字段中
@model FillOutVm
@Html.HiddenFor(s=>s.Pid)
在进行 Ajax 调用的 js 代码中,读取此输入字段的值并使用它并将其作为您从 Ajax 调用发送的数据传递。
var pid=$("#Pid").val();
//use pid variable value in your ajax call now
您需要向操作方法添加一个参数才能接受此 pid 值。
[HttpPost]
public ActionResult SubmitAnswers ( List<AnswerSubmission> Answers,Guid pid )
{
// do something with the passed values
}
另一种选择是将值存储在数据库表/会话状态等中。