单击第一次更改按钮文本按钮时,第二次单击会重定向到其他页面 -
public partial class _Default : System.Web.UI.Page
{
int clickCount;
protected void btn_clicked(object sender, EventArgs e)
{
clickCount++;
if (clickCount == 1)
(sender as Button).Text = "go to landing page";
else
Response.Redirect("LandingPage.aspx");
}
}
很明显,每次重新加载页面时,clickCount都会重新初始化,否则block永远不会执行。 为了维持clickCount状态,我可以使用视图状态,会话状态,应用程序状态,隐藏字段或JS代码等等。对于这种特定情况最好的是什么 - >问题1。
由于MVC是无状态且类似的代码也在控制器中编写,因此每次ActionHandler或控制器实例化时都会重新初始化clickCount。你如何处理ASP.NET MVC中的类似情况 - >疑问句。 2
答案 0 :(得分:3)
创建一个模型以传入视图,并在其上添加属性:
public int ClickCount{get;set;}
然后在视图中,创建隐藏值
@Html.HiddenFor(f=>f.ClickCount)
在控制器上发布事件期间,更新模型
public ActionResult(ViewModel model){
model.ClickCount++;
}
答案 1 :(得分:2)
如果我想跟踪按钮点击次数,我会使用谷歌分析。如果我想在我自己的应用程序中跟踪它们,我会使用数据库(只需在提交或单击时更新数据库记录)。如果我没有/不能使用数据库,您可以创建一个隐藏字段并使用按钮点击次数继续更新,如下所示:
控制器:
<HttpPost()>
Function MyFormPost(Optional ByVal clicks As Integer = 0) As ActionResult
ViewBag.Clicks += clicks
Return View()
End Function
查看:
@Using Html.BeginForm()
@Html.ValidationSummary(True)
@Html.Hidden("clicks", ViewBag.Clicks)
End Using
注意:这是VB.NET。
答案 2 :(得分:1)
问题1
取决于:
IMO,最好的解决方案是将计数保持在视图状态,但可能会根据上述问题进行更改。
问题2
非常不同。首先,您将没有“按钮点击事件”,您将获取(或发布)来自您的控制器的操作。所以,正如你所看到的,它需要完全不同的方法。
旁注:请记住,MVC不仅是无状态的。 HTTP在设计上是无状态的。
答案 3 :(得分:1)
这可能不是这个问题的最佳解决方案,但它应该让你走上正轨。
public partial class _Default : System.Web.UI.Page
{
protected void btn_clicked(object sender, EventArgs e)
{
int clickCount;
try
{
clickCount = int.Parse(Session["ClickCount"]);
clickCount++;
}
catch
{
clickCount = 1;
}
Session["ClickCount"] = clickCount;
if (clickCount == 1)
{
(sender as Button).Text = "go to landing page";
}
else
{
Response.Redirect("LandingPage.aspx");
}
}
}
通过使用Session,如果用户离开页面并返回,它将保持不变。 (仅在特定时间范围内。如果您希望它持续更长时间,请使用cookie。)