Asp.net 如何从ASPX代码中重构页面成员?

Asp.net 如何从ASPX代码中重构页面成员?,asp.net,refactoring,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?

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

在正常情况下,如果两个用户同时加载页面,他们将使用不同的页面实例。由于numberOne和numberTwo是实例变量,因此不会出现共享状态和线程问题。

在正常情况下,如果两个用户同时加载页面,他们将使用页面的不同实例。由于numberOne和numberTwo是实例变量,因此不会出现共享状态和线程问题。

此代码正常。每次加载页面时都会实例化成员变量,因为每次加载页面时都会创建一个新的类实例。如果变量是静态的,那么只有当两个人同时加载页面时,才会出现问题


想想你放在页面上的控件。它们是成员变量,但在不同请求同时加载页面时没有问题。

此代码正常。每次加载页面时都会实例化成员变量,因为每次加载页面时都会创建一个新的类实例。如果变量是静态的,那么只有当两个人同时加载页面时,才会出现问题


想想你放在页面上的控件。它们是成员变量,但在不同请求同时加载页面时,它们没有问题。

虽然代码(如前所述)没有任何问题,但如果您想重构它,我可能会按照

使用制度; 使用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页面上添加一个
控件

,虽然代码没有任何问题(如前所述),但如果您想要重构它,我可能会按照以下方式做一些事情:

使用制度; 使用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页面上添加一个
控件

谢谢。我完全误解了ASPX渲染周期。这澄清了很多,谢谢。我完全误解了ASPX渲染周期。这澄清了很多问题。