我继承了一个项目,该项目使用以下模式将参数从后面的代码传递到aspx页面。我知道这是错误的,但我在重构它的最佳方法上处于困境。
代码背后:
using System;
using System.Web;
namespace BadPassing
{
public partial class _Default : System.Web.UI.Page
{
private Random rnd = new Random(); //Is this bad?
protected int numberOne; //this is bad
protected int numberTwo; //this is bad
protected void Page_Load(object sender, EventArgs e)
{
numberOne = rnd.Next(100);
numberTwo = rnd.Next(100);
}
}
}
ASPX页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="BadPassing._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Bad Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="http://www.google.com/search?q=<%=this.numberOne %>%2B<%=this.numberTwo %>">
Add <%=this.numberOne %> and <%=this.numberTwo %> using google.
</a>
</div>
</form>
</body>
</html>
我的理解是numberOne和numberTwo不是线程安全的,如果两个人同时加载页面,可能会导致错误的行为。此外,如果页面依赖numberOne和numberTwo来存储回发之间的值,则多个并发用户会导致意外结果。
我是否理解为什么上述技术如此错误,如果是这样,你将如何最好地重构这段代码?
另外,将无状态页面级服务(如Random)存储为页面类的成员变量是不正确的?
答案 0 :(得分:4)
此代码没问题。每次加载页面时都会实例化成员变量,因为在每个页面加载时都会创建一个新的类实例。如果变量是静态的,那么只有在同一时刻加载页面的2个人才会遇到问题。
考虑一下您在页面上删除的控件。它们是成员变量,但它们不会因不同请求同时加载页面而出现问题。
答案 1 :(得分:1)
在正常情况下,如果两个用户同时加载页面,他们将使用页面的不同实例。由于numberOne和numberTwo是实例变量,因此没有共享状态,也没有线程问题。
答案 2 :(得分:0)
虽然如果你想重构代码(如上所述)并没有任何错误,我可能会做一些事情
使用System; 使用System.Web;
namespace BadPassing
{
public partial class _Default : System.Web.UI.Page
{
private Random rnd = new Random(); //Is this bad?
protected int numberOne; //this is bad
protected int numberTwo; //this is bad
protected void Page_Load(object sender, EventArgs e)
{
numberOne = rnd.Next(100);
numberTwo = rnd.Next(100);
searchLink.NavigationUrl = String.Format("http://www.google.com/search?q={0}%2B{1}", numberOne, numberTwo);
searchLink.Text = String.Format("Add {0} and {1} using google", numberOne, numberTwo);
}
}
}
然后在您的aspx页面上添加<asp:hyperlink>
控件