C# 增加每次调用控制器时会话变量的值

C# 增加每次调用控制器时会话变量的值,c#,asp.net-mvc,C#,Asp.net Mvc,每次单击视图中的链接并调用控制器中的操作结果方法时,我需要增加会话变量的值,但它不起作用 当我开始时,值为17,当我单击链接并将1传递给控制器时,我希望结果为18,下次单击时应为19 但是我做错了什么?我如何改进代码?该值是ActionResult中可为空的int public ActionResult Index(int? value) { // Session if (Session["week"] == null) {

每次单击
视图中的链接
并调用
控制器中的
操作结果
方法时,我需要增加
会话
变量的值,但它不起作用

当我开始时,值为17,当我单击链接并将1传递给
控制器时,我希望结果为18,下次单击时应为19

但是我做错了什么?我如何改进代码?该值是
ActionResult
中可为空的int

public ActionResult Index(int? value) {

        // Session
        if (Session["week"] == null)
        {
            // Create session
            Session["week"] = week.WeekNum();
        }

        if (!value.HasValue)
        {
            weekStart = (int)Session["week"];
        }
        else
        {
            Session["week"] = + value;
            weekStart = (int)Session["week"];
        }

        ViewBag.weekNumber = weekStart;

        ... the rest of the code...
        }

您可以像从任何其他数据源一样增加值:

  • 检索值
  • 修改值
  • 存储新值
  • 这可以是简单的事情,比如:

    var weekValue = int.Parse(Session["week"].ToString());
    weekValue += value;
    Session["week"] = weekValue;
    
    如果会话变量可能不是有效整数,则可以使用
    int.TryParse()
    或其他方法检查该条件

    或者为了避免使用该
    .ToString()
    调用,如果该值出现错误的可能性很小,可以首先使用
    int.Parse()
    ,那么我认为您也可以解决这个问题:

    var weekValue = Convert.ToInt32(Session["week"]);
    

    这对于输入类型来说更为宽容,因为它有许多重载。

    我建议编写一个帮助函数来执行增量操作,例如

    private void IncrementWeeks(int weeks)
    {
        if (Session["week"] == null)
        {
            Session["week"] = week.WeekNum();
            return;
        }
    
        int currentWeek = 0;
    
        if (int.TryParse(Session["week"].ToString(), out currentWeek))
        {
            Session["week"] = (currentWeek + weeks).ToString();
        }
    }
    
    仅讨论
    NULL
    检查和
    int
    转换问题

    下面是如何将从会话中获取值包装到助手函数中:

    private int ReadWeekFromSession()
    {
        if (Session["week"] == null)
        {
            return 0;
        }
    
        int currentWeek = 0;
    
        if (int.TryParse(Session["week"].ToString(), out currentWeek))
        {
        }
    
        return currentWeek;
    }
    
    例如:

    public ActionResult Index(int? value)
    {
        int weekStart = 0;
    
        if (!value.HasValue)
        {
            weekStart = ReadWeekFromSession();
        }
        else
        {
            IncrementWeeks(value.Value);
            weekStart = ReadWeekFromSession();
        }
    
        // Rest of controller code....    
    }
    

    你所说的
    不起作用是什么意思。
    ?@JasonEvans它没有增加值。谢谢你的回答!这似乎是某种问题。我在这个代码下面有一条红线…(会话[“周]);错误消息是“无法从对象转换为字符串”?第二行下面还有一条红线,但当我在值之前添加(int)时,它消失了。@3D kretive:如果格式化的错误可能性很低,那么您可以使用
    Convert.ToInt32()
    而不是
    int.Parse()
    。为了使用后者,我假设在会话值后面附加一个
    .ToString()
    ,从技术上讲就是这样。我会更新答案…我想这会很容易解决,在我在“value”前面加上(int)后,第二行就不起作用了。错误消息:可为Null的对象必须有一个值,如果“value”前面没有(int),则错误为:无法隐式转换int类型?到int@3D-克雷蒂夫:如果您已经检查了
    .HasValue
    属性(看起来您已经检查了),那么您就可以安全地使用
    +=value.value
    。@3D克雷蒂夫:什么意思?你应该保留任何你需要的代码来执行你想要执行的逻辑,希望它能满足你的需要。您可能需要调整它以满足您的要求,但它应该是您的一个良好起点。当我第一次跑步时,在我删除会话后,当前周不应该设置为当前周吗?我不确定我是否理解您的意思。如果您擦除会话,则会话[“周”]将为
    NULL
    (如果这就是您所说的
    擦除
    )。我的意思是,第一次运行结果时,非常感谢您的帮助!你的回答非常详细!只是想知道为什么要使用toString,因为它都是关于int值的,“out”在这两个代码块中扮演什么角色?