3

我正在从 PHP 迁移到 ASP.NET/C#。到目前为止一切顺利,但我不明白如何在 ASP.NET C# 类页面中实例化一个类。

例如我有 login.aspx:

<%@ Page Language="C#" Inherits="Portal.LoginService" src="LoginService.cs" %>

<!DOCTYPE html>
<body>
    <form runat="server" id="login" name="login">           
        <p>Username:</p><input type="text" id="username" name="username" runat="server" />  

        <p>Password:</p><input type="password" id="password" name="password" runat="server" />

        <input type="submit" name="submit" OnServerClick="Post_Form" runat="Server" /> 
    </form>
</body>

登录服务.cs:

using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;
namespace Portal {
public class LoginService : Page {

    protected HtmlInputControl username, password;

    public void Post_Form(object sender, EventArgs e) {

        if (username.Value != "" && password.Value != "") {
            //LOGIC HERE

            //This doesn't work
            CustomSanitize a = new CustomSanitize();                              
        }
    }
}
}

CustomSanitize.cs:

using System;
namespace Portal {
    public class CustomSanitize {

        //instantiate here

        public string sanitizeUserPass() {
                return "logic here"
            }
    }
}

换句话说,我想将来自不同类的方法与我用 ASP.NET C# 设置的类一起使用。到目前为止,命名空间对我不起作用。

感谢您的任何意见。

4

4 回答 4

5

如果我理解正确,请包装CustomSanitize在命名空间中,即:

namespace MyProject {
    public class CustomSanitize {

        //instantiate here

        public string sanitizeUserPass() {
                return "logic here"
            }
    }
}

然后包装LoginService.cs在同一个命名空间中。IE

namespace MyProject {
    public class LoginService : Page {

        protected HtmlInputControl username, password;

        public void Post_Form(object sender, EventArgs e) {

            if (username.Value != "" && password.Value != "") {
                //LOGIC HERE

                //This doesn't work
                //CustomSanitize a = new CustomSanitize();                              
            }
        }
    }
}

您现在应该可以访问CustomSanitize a = new CustomSanitize();

您还可以创建更多命名空间来拆分您的项目。即namespace MyProject.Helper包装所有辅助函数,然后只需添加到您希望在其上使用类using MyProject.Helper的文件的顶部。.cs

编辑:

请注意,在将命名空间添加到您的项目/在命名空间中包装类时,您需要通过该命名空间通过using或直接引用它们MyProject.LoginService。这必须在页面aspxascx以及使用@ Page declaration.

于 2012-12-20T15:28:09.273 回答
2

如果上述所有类都在同一个项目中,那么您需要做的就是添加一个命名空间。查看以下示例:命名空间教程

如果您希望在同一个项目中使用不同的命名空间,请在顶部添加您自己的“使用”行,即

using System;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using Utilities.Sanitizers;

namespace Services {

public class LoginService : Page {

protected HtmlInputControl username, password;

public void Post_Form(object sender, EventArgs e) {

    if (username.Value != "" && password.Value != "") {
        //LOGIC HERE

        //This doesn't work
        //CustomSanitize a = new CustomSanitize();                              
    }
}
}
}

using System;
namespace Utilities.Sanitizers
{
public class CustomSanitize {

    //instantiate here

    public string sanitizeUserPass() {
            return "logic here"
        }
}
}
于 2012-12-20T15:32:08.193 回答
1

在您的CustomSanitizeloginservice班级中,您缺少项目的名称空间。

除此之外,您可能还想为您的类创建一个构造函数。这不是必需的,但允许您在另一个文件中实例化您的类时设置默认设置。(当您没有自己设置时,编译器会生成一个空的构造函数。因此,此代码示例中的构造函数是多余的。但只是为了向您展示。)

这也适用于创建重载构造函数,允许您将各种参数传递给构造函数,以便编译器选择正确的参数。

尽管您面临的主要问题可能是您的项目中没有包含名称空间。当文件在同一个项目中时,您应该为该项目中的所有类添加一个命名空间。因此它们可以相互引用。

如:

using System;

namespace yourNameSpace
{
    public class CustomSanitize 
    {

        public CustomSanitize()
        {
            //Set what you need to set in the constructor
        }
        //instantiate here

        public string sanitizeUserPass() {
            return "logic here"
        }
    }
}

默认情况下,当您从 Visual Studio 中生成新类时,“应该”添加命名空间。除非你每次都从一个空的代码文件开始。

于 2012-12-20T15:37:24.377 回答
0

没有人提到的一件事是您不需要为用户身份验证做任何这样的事情。您应该考虑使用开箱即用的 .net 身份验证和授权 - 请参阅此处:https://www.google.co.uk/search?q=.net+authentication&aq=0&oq=.net+authen&aqs=chrome。 1.57j0l3j62l2.2451&sugexp=chrome,mod=19&sourceid=chrome&ie=UTF-8

不过其他人说的都是对的。它不起作用,因为您缺少 using 语句(Intelisense 应该告诉您 - 您实际上应该能够单击小下划线位,然后单击添加使用链接)

您所做的另一件事已添加到以下内容中:-

protected HtmlInputControl username, password;

这在 asp.net 表单页面中不是必需的。我假设您已经完成了很多手动工作——幸好.net 比这容易得多。

这更像是页面的外观:-

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebApplication2.Login" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label runat="server" AssociatedControlID="Username">Username:</asp:Label>     <asp:TextBox runat="server" ID="Username"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="Username" Display="Dynamic" Text="Username is required"></asp:RequiredFieldValidator>
        <br/>
        <asp:Label ID="Label1" runat="server" AssociatedControlID="Password">Password:</asp:Label> <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
    <asp:RequiredFieldValidator runat="server" ControlToValidate="Password" Display="Dynamic" Text="Password is required"></asp:RequiredFieldValidator>
        <br/>
        <asp:Button runat="server" Text="Login" ID="btnLogin" OnClick="btnLogin_Click" />
    </div>
    </form>
</body>
</html>

以及背后的代码: using System;

namespace WebApplication2
{
    public partial class Login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnLogin_Click(object sender, EventArgs e)
        {
            Page.Validate();
            if (Page.IsValid)
            {
                string username = Username.Text;
                string password = Password.Text;
                //Logic here
            }
        }

    }
}

这会为您处理所有验证。我真的建议在这里观看一些视频以帮助加快速度:http ://www.asp.net/web-forms ,但您也应该认真考虑使用 MVC,因为它更适合您尝试的方式发展

于 2012-12-20T15:53:26.807 回答