我从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>
LoginService.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#设置的类。到目前为止,命名空间对我来说并不起作用。
感谢您的任何意见。
答案 0 :(得分:5)
如果我正确地表达了你,请将CustomSanitize
包裹在名称空间中,即:
namespace MyProject {
public class CustomSanitize {
//instantiate here
public string sanitizeUserPass() {
return "logic here"
}
}
}
然后将LoginService.cs
包装在同一名称空间中。即
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
通过该命名空间引用它们。必须使用aspx
在ascx
,@ Page declaration
页面上完成此操作。
答案 1 :(得分:2)
如果您的所有上述类都在同一个项目中,那么您需要做的就是添加命名空间。请查看以下示例:Namespace tutorial
如果您希望在同一个项目中使用不同的命名空间,请在顶部添加您自己的“使用”行,即
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"
}
}
}
答案 2 :(得分:1)
在您的CustomSanitize
和loginservice
课程中,您缺少项目的命名空间。
除此之外,您可能希望为您的类创建构造函数。这不是必需的,但允许您在另一个文件中实例化类时设置默认设置。 (当你没有自己设置时,编译器会生成一个空构造函数。所以这个代码示例中的那个是冗余的。但只是为了向你展示。)
这与创建重载的构造函数一样,允许您将各种参数传递给构造函数,以便编译器选择正确的参数。
虽然您面临的主要问题可能是您的项目中没有包含名称空间。当文件在同一个项目中时,您应该为该项目中的所有类添加命名空间。因此可以在彼此之间引用它们。
如:
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中生成新类时,应添加名称空间。除非你每次都以空代码文件开头。
答案 3 :(得分: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
然而其他人都说的是正确的。这是行不通的,因为你错过了一个使用的声明(Intelisense应该告诉你 - 你应该能够点击小的下划线位,然后点击添加使用链接)
您已完成的另一件事情如下: -
protected HtmlInputControl username, password;
在asp.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>
背后的代码: 使用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,因为它更适合您尝试开发的方式