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”在这两个代码块中扮演什么角色?