Asp.net Button Click事件和MVC

时间:2012-09-13 19:18:27

标签: c# asp.net-mvc event-handling

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

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

4 个答案:

答案 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。)