在我的控制器类中,我在哪里保存与页面关联的变量

本文关键字:关联 变量 保存 在哪里 控制器 我的 | 更新日期: 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
}

另一种选择是将值存储在数据库表/会话状态等中。