1

第一次单击按钮更改按钮文本时,第二次单击重定向到其他页面 -

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 都会重新初始化,并且 else 块永远不会执行。为了保持 clickCount 状态,我可以使用视图状态、会话状态、应用程序状态、隐藏字段或 JS 代码等。对于这种特殊情况,什么是最好的 -> 问题 1。

由于 MVC 是无状态的,并且在控制器中编写的类似代码也是如此,因此每次实例化 ActionHandler 或控制器时都会重新初始化 clickCount。您如何处理 ASP.NET MVC -> Ques 中的类似情况。2

4

4 回答 4

3

创建一个模型以传递到带有属性的视图中:

public int ClickCount{get;set;}

然后在视图中,创建一个隐藏值

@Html.HiddenFor(f=>f.ClickCount)

在控制器上的发布事件期间,更新模型

public ActionResult(ViewModel model){
model.ClickCount++;
}
于 2012-09-13T19:25:28.377 回答
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。

于 2012-09-13T19:28:43.347 回答
1

问题 1

依靠:

  • 您是否需要在应用程序的其他任何地方使用此点击计数?
  • 这是一个明智的信息吗?
  • 如果用户看到这个计数有问题吗?

IMO,最好的解决方案是保持对视图状态的计数,但它可能会根据上述问题而改变。

问题2

这将是非常不同的。首先,您不会有“按钮单击事件”,您会从控制器获取(或发布)一个动作。因此,如您所见,这将需要一种完全不同的方法。

旁注:请记住,不仅 MVC 是无状态的。HTTP 在设计上是无状态的。

于 2012-09-13T19:24:20.157 回答
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。)

于 2012-09-13T19:26:34.797 回答