【问题标题】:Persist values between two action results in one controller在一个控制器中保留两个操作结果之间的值
【发布时间】:2012-01-28 15:17:02
【问题描述】:

我在控制器的一种操作方法中生成值。如何在来自同一控制器的另一个操作结果中使用相同的变量值?

例如:

控制器 A - 动作结果 1:

 public ActionResult CalculationsONE()
{       
        dynamic CalcModel = new ExpandoObject();
        int var1 = //Value calculated here
        int var2 = //Calculation

        CalcModel.Var1= var1;
        CalcModel.Var2= var2;

        return View(CalcModel);

}

控制器 A - 动作结果 2:

  public ActionResult CalculationsTWO()
{       
   // I want to use var1 and var2 from the CalculationsONE in 
     this action result

 }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 controller


    【解决方案1】:

    只需将它们作为查询字符串参数传递:

    public ActionResult CalculationsTWO(int var1, int var2)
    {       
        ...
    }
    

    为了从CalculationsONE 操作中呈现的视图中调用CalculationsTWO 操作,您可以生成如下链接:

    @model CalcModel
    @Html.ActionLink(
        "call calculations2", 
        "calculationstwo", 
        "somecontroller" 
        new { 
            var1 = Model.Var1, 
            var2 = Model.Var2 
        }
    )
    

    哦,我建议您使用强类型视图模型,而不是传递给视图的动态对象。 ViewBag 是动态的,但老实说,使用视图模型。你会更快乐:-)

    【讨论】:

    • 在实际场景中,出于这些原因更改操作合同并不是一个好主意。
    • @Jani,为什么?调整控制器动作签名以满足从视图传递的值对我来说似乎是个好主意。即使在现实世界的场景中。我一直都这样做。这称为重构。在这种情况下,动作需要 2 个值,所以对我来说调整动作签名以将这 2 个值作为参数似乎是合理的。
    • 但是当第二个方法被定义时没有任何参数,这意味着它在没有任何参数的情况下被调用并且它是有意义的并且为了另一个动作而改变该动作的签名似乎是不合理的恕我直言
    • @Jani,我对此表示怀疑,因为现在 OP 无法在第二个动作中获取两个变量。所以这第二个动作甚至不存在,因为他没有能力执行它。但我同意,如果动作以某种方式存在,他无论如何都会改变它的实现,所以在我看来改变它的调用方式也是合理的。
    • @darin 如何用 aspx 语法编写“@model CalcModel”。
    【解决方案2】:

    如果它们是两个单独的操作,则 Darin Dimitrov 的上述答案应该这样做,否则如果您希望两个结果都在一个资源调用中创建两个私有方法在您的控制器中执行 calc1 和 calc2 并将结果返回到视图...

    results: {
       calc1: ....
       calc2: ....
    }
    

    您可以像当前一样使用类变量来跟踪值。

    【讨论】:

      【解决方案3】:

      作为替代方案,我会将您的变量保存到会话中。

      EG:

      this.Session["variable"]
      
      
      this.HttpContext.Session["variable"]
      

      或通过 ViewData["string"] 将它们传递到视图和控制器中的 Request.FormData["VariableName"] 以将其绑定回来

      另一种方法是 将数据添加到视图模型 并在控制器中的回发时将模型绑定回变量

      例如:

      // postback action
      public ActionResult RebindMethod(ModelToUse rebindToMyModel){
      
      }
      

      模型定义在哪里:

      public class ModelToUse{
          public string MyVariableToPersist{get;set;}
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-04
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        相关资源
        最近更新 更多