当第一次点击按钮更改按钮文本时,第二次点击重定向到其他页面-
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都会被重新初始化,否则块永远不会执行。为了保持clickCount状态,我可能会使用视图状态、会话状态、应用程序状态、隐藏字段或JS代码等。对于这种特殊情况,什么是最好的->问题1。
由于MVC是无状态的,并且类似的代码也是在控制器中编写的,所以每次实例化ActionHandler或控制器时都会重新初始化clickCount。在ASP.NET MVC->Ques中,您如何处理类似的情况。2
创建一个模型以传递到带有属性的视图中:
public int ClickCount{get;set;}
然后在视图中,创建一个隐藏值
@Html.HiddenFor(f=>f.ClickCount)
在控制器上的后事件期间,更新型号
public ActionResult(ViewModel model){
model.ClickCount++;
}
如果我想跟踪按钮点击情况,我会使用谷歌分析。如果我想在自己的应用程序中跟踪它们,我会使用数据库(只需在提交或单击时更新数据库记录)。如果我没有/不能使用数据库,你可以创建一个隐藏字段,并通过点击按钮的次数不断更新它,比如:
控制器:
<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.
问题1
取决于:
- 你需要在应用程序的其他地方使用这个点击计数吗
- 这个数字是合理的信息吗
- 如果用户看到这个计数,会有问题吗
IMO,最好的解决方案是保持对视图状态的计数,但它可能会根据上述问题而改变。
问题2
这将是非常不同的。首先,你不会有"按钮点击事件",你会从控制器中获得(或发布)一个动作。因此,正如你所看到的,这将需要一种完全不同的方法。
附带说明:请记住,不是只有MVC是无状态的。HTTP在设计上是无状态的。
这可能不是解决这个问题的最佳方案,但它应该会让您走上正轨。
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。)