为控制器

时间:2016-04-25 12:55:43

标签: c# asp.net-mvc

每次点击View中的链接并在ActionResult中调用Controller方法时,我都需要增加session变量的值,但是它不起作用。

当我开始时,该值为17,当我点击链接并将1传递给Controller时,我希望结果为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...
        }

2 个答案:

答案 0 :(得分:1)

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

  1. 检索值
  2. 修改值
  3. 存储新值
  4. 这可能是一件简单的事情:

    var weekValue = int.Parse(Session["week"].ToString());
    weekValue += value;
    Session["week"] = weekValue;
    

    如果会话变量可能不是有效整数,则可以使用int.TryParse()或其他方法检查该条件。

    或者为了避免使用.ToString()次调用,如果该值的错误可能性小到足以首先使用int.Parse(),那么我想您也可以使用此功能:< / p>

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

    对输入类型有点宽容,因为它有许多重载。

答案 1 :(得分:1)

我建议编写辅助函数来执行增量,例如

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....    
}