您如何从ASPX代码中重构页面成员?

时间:2009-01-08 02:06:22

标签: asp.net refactoring

我继承了一个项目,该项目使用以下模式将参数从后面的代码传递到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)存储为页面类的成员变量是不正确的?

3 个答案:

答案 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>控件