我是一名新的ASP.NET开发人员,我正在使用这种编程语言为我开发第一个Web应用程序。我试图通过开发以下方案使用向导控件来管理用户: 向导Step1:包含一个TextBox,管理员可以在其中输入用户的用户名 当他点击下一个按钮时,将根据数据库中的users表检查用户名;如果他存在于数据库中,他的信息将显示在向导Step2中,他的信息将是只读的。如果他不存在,将通知管理员一条消息。
向导步骤2:包含显示用户信息的转发器或占位符。
向导Step3:此外,如果用户已存在此步骤,则会在系统中显示此用户的当前角色,并显示用于编辑他角色的按钮
我的ASP.NET代码:
<asp:Wizard ID="Wizard1" runat="server" DisplaySideBar="false" Width="80%" >
<WizardSteps>
<asp:WizardStep ID="WizardStep1" runat="server" title="Employee Username/Network ID">
<table border="0">
<tr>
<td class="InputLabel">Username:</td>
<td class="InputControl">
<asp:TextBox ID="TextBox1" runat="server" />
</td>
</tr>
</table>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep2" runat="server" title="Manage User">
<div class="content">
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
</div>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep3" runat="server" Title="Edit User Role">
<label for="role">Current Role: </label>
<asp:Label ID="Label1" runat="server" BackColor="#FFFF99" Font-Bold="True" ForeColor="#000099" />
<asp:RadioButtonList id="radio1" runat="server" TextAlign="left">
<asp:ListItem id="option1" runat="server" value="Admin" />
<asp:ListItem id="option2" runat="server" value="Contribute" />
<asp:ListItem id="option3" runat="server" value="User" />
</asp:RadioButtonList>
<asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Clicked" />
</asp:WizardStep>
</WizardSteps>
<HeaderTemplate>
<ul id="wizHeader">
<asp:Repeater ID="SideBarList" runat="server">
<ItemTemplate>
<li><a class="<%# GetClassForWizardStep(Container.DataItem) %>" title="<%#Eval("Name")%>">
<%# Eval("Name")%></a> </li>
</ItemTemplate>
</asp:Repeater>
</ul>
</HeaderTemplate>
</asp:Wizard>
Code-Behind是
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class UserManagement : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string username = TextBox1.Text;
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
string cmdText = "SELECT * FROM employee WHERE Username = @Username";
//For checking the user
if (username != null)
{
if (CheckUsername(username) == true)
{
try
{
SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand(cmdText, conn);
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
Console.WriteLine(myReader["Name"].ToString());
Console.WriteLine(myReader["JobTitle"].ToString());
Repeater1.DataSource = myReader;
Repeater1.DataBind();
myReader.Close();
conn.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
//For sending object to the Wizard1.PreRender
Wizard1.PreRender += new EventHandler(Wizard1_PreRender);
}
//Method for checking the existence of the username in the database (retrun true or false)
private bool CheckUsername(string username)
{
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
string cmdText = "SELECT Count(*) FROM employee WHERE Username = '" + username + "'";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open(); // Open DB connection.
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
int count = (int)cmd.ExecuteScalar();
// True (> 0) when the username exists, false (= 0) when the username does not exist.
return (count > 0);
}
}
}
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
if (Wizard1.ActiveStepIndex == 1)
{
string username = TextBox1.Text;
}
}
//Method for replacing the default sidebar of the Wizard Control with a custom sidebar (represented in a repeater)
protected void Wizard1_PreRender(object sender, EventArgs e)
{
Repeater SideBarList = Wizard1.FindControl("HeaderContainer").FindControl("SideBarList") as Repeater;
SideBarList.DataSource = Wizard1.WizardSteps;
SideBarList.DataBind();
}
protected string GetClassForWizardStep(object wizardStep)
{
WizardStep step = wizardStep as WizardStep;
if (step == null)
{
return "";
}
int stepIndex = Wizard1.WizardSteps.IndexOf(step);
if (stepIndex < Wizard1.ActiveStepIndex)
{
return "prevStep";
}
else if (stepIndex > Wizard1.ActiveStepIndex)
{
return "nextStep";
}
else
{
return "currentStep";
}
}
protected void Button1_Clicked(Object sender, EventArgs e)
{
// When the button is clicked,
// show the new role of the user
//Label1.Text = "...button clicked...";
}
}
//Session["Username"] = Username.Text;
//String strUserName = Request.QueryString["Username"];
//string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
//string cmdText = "SELECT * FROM employee WHERE Username = @Username";
////For checking the user
//if (Request.QueryString["Username"] != null)
//{
// //String strUserName = Request.QueryString["Username"];
// ////Check userName Here
// //String strReturnStatus = "false";
// if (CheckUsername(Request.QueryString["Username"]) == true)
// {
// //strReturnStatus = "true";
// try
// {
// SqlConnection conn = new SqlConnection(connString);
// conn.Open();
// SqlDataReader myReader = null;
// SqlCommand myCommand = new SqlCommand(cmdText, conn);
// myReader = myCommand.ExecuteReader();
// while (myReader.Read())
// {
// Console.WriteLine(myReader["Name"].ToString());
// Console.WriteLine(myReader["JobTitle"].ToString());
// Repeater1.DataSource = myReader;
// Repeater1.DataBind();
// myReader.Close();
// conn.Close();
// }
// }
// catch (Exception ex)
// {
// Console.WriteLine(ex.ToString());
// }
// }
我正在努力解决代码问题。即使检查用户名也不起作用,我不知道为什么。此外,我不确定是否应该在内部放置任何代码来显示数据库中的用户信息。
更新
对于角色,我有三个用于获取和设置角色的表。它们的结构如下:
用户表:名称,用户名,部门(用户名是主键)
角色表: RoleID,RoleName(RoleID是主键)
UserRole表: UserRoleID,用户名,RoleID(UserRoleID是主键)
另一个更新(最后):
用户表:名称,用户名,部门代码(用户名是主键)
部门表格表:部门代码,DepartmantName(部门代码是主键)
角色表: RoleID,RoleName(RoleID是主键)
UserRole表: UserRoleID,用户名,RoleID(UserRoleID是主键)
我在Wizard1_NextButtonClick方法中使用以下查询:
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
switch (Wizard1.WizardSteps[e.NextStepIndex].ID)
{
case "WizardStep2":
string username = TextBox1.Text;
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
//For checking the user
if (!String.IsNullOrEmpty(username) && CheckUsername(username))
{
try
{
Session["Username"] = username;
SqlConnection conn = new SqlConnection(connString);
conn.Open();
//string cmdText = "SELECT * FROM employee WHERE Username = @Username";
string cmdText = "SELECT dbo.employee.Username, dbo.employee.Name, dbo.employee.JobTitle, dbo.employee.BadgeNo," +
"ISNULL(dbo.Roles.RoleID, 3) AS RoleID, dbo.Divisions.DivisionName" +
"FROM dbo.Divisions INNER JOIN dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode" +
"LEFT OUTER JOIN dbo.Roles RIGHT OUTER JOIN dbo.UserRole ON dbo.Roles.RoleID = dbo.UserRole.RoleID ON" +
"dbo.employee.Username = dbo.UserRole.Username" +
"WHERE (dbo.employee.Username = @Username)";
SqlCommand myCommand = new SqlCommand(cmdText, conn);
myCommand.Parameters.AddWithValue("@Username", username);
DataTable table = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(myCommand);
adapter.Fill(table);
string Name = table.Rows[0]["Name"] as string;
string Username = table.Rows[0]["Username"] as string;
//string DivisionName = table.Rows[0]["DivisionName"] as string;
string JobTitle = table.Rows[0]["JobTitle"] as string;
string BadgeNo = table.Rows[0]["BadgeNo"].ToString();
//string role = table.Rows[0]["RoleName"] as string;
lblName.Text = Name;
lblUsername.Text = Username;
//lblDivision.Text = DivisionName;
lblJobTitle.Text = JobTitle;
lblBadgeNo.Text = BadgeNo;
//lblRole.Text = role;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else
{
//If the user does not exist or a blank value has been entered
//Cancel the nextstep redirection and display an error message in a span
e.Cancel = true;
errorSpan.InnerText = "The user id specified is blank or does not exist";
}
break;
case "WizardStep3":
//Simply bind the radio list
radio1.SelectedValue = lblRole.Text;
break;
}
}
查询将在向导Step2中显示我的姓名,用户名,部门(或部门),职务和徽章编号。此外,它应该向我展示用户在向导步骤3中的角色,使管理员能够插入和删除角色,而不是更新角色。
我在SQLServer Management Studio中测试了查询并且它运行良好但是当我把它放在C#代码中时,我没有在网页上得到任何结果,我不知道为什么。
答案 0 :(得分:1)
1)我发现的第一个问题是页面加载的代码必须移动到Wizard1_NextButtonClick事件。
2)我删除了Repeater的代码,而是选择将第二步返回的信息放入标签中。
3)实施逻辑以更新步骤3中的用户角色
4)对HTML源进行了微小的更改,但除此之外它与您最初的相同
下面显示了背后的源代码和代码,我已经在我的机器上进行了测试,看起来正在做你需要的,如果你需要任何改变,请告诉我:
<asp:Wizard ID="Wizard1" runat="server" DisplaySideBar="false" Width="80%" ActiveStepIndex="2"
OnNextButtonClick="Wizard1_NextButtonClick">
<WizardSteps>
<asp:WizardStep ID="WizardStep1" runat="server" Title="Employee Username/Network ID">
<table border="0">
<tr>
<td class="InputLabel">
Username:
</td>
<td class="InputControl">
<asp:TextBox ID="TextBox1" runat="server" />
</td>
<td>
<span id="errorSpan" runat="server" style="color:Red;"></span>
</td>
</tr>
</table>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep2" runat="server" Title="Manage User">
<div class="content">
<table>
<tr>
<td>
<asp:Label ID="lblName" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblJobTitle" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblRole" runat="server"></asp:Label>
</td>
</tr>
</table>
</div>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep3" runat="server" Title="Edit User Role">
<label for="role">
Current Role:
</label>
<asp:Label ID="Label1" runat="server" BackColor="#FFFF99" Font-Bold="True" ForeColor="#000099" />
<asp:RadioButtonList ID="radio1" runat="server" TextAlign="left">
<asp:ListItem id="option1" runat="server" Value="Admin" />
<asp:ListItem id="option2" runat="server" Value="Contribute" />
<asp:ListItem id="option3" runat="server" Value="User" />
</asp:RadioButtonList>
<asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Clicked" />
<span id="infoSpan" runat="server" style="color:Red;"></span>
</asp:WizardStep>
</WizardSteps>
<HeaderTemplate>
<ul id="wizHeader">
<asp:Repeater ID="SideBarList" runat="server">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
</ul>
</HeaderTemplate>
</asp:Wizard>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Set the Wizard Step 0 as the initial wizard step when the page loads
if (!Page.IsPostBack)
{
Wizard1.ActiveStepIndex = 0;
}
}
protected void Button1_Clicked(object sender, EventArgs e)
{
//If one of the items is selected AND a username exists in the Username session object update the user role
if (!String.IsNullOrEmpty(radio1.SelectedValue) && Session["Username"] != null)
{
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
string cmdText = "UPDATE employee SET Role = '" + radio1.SelectedValue + "'" +
"WHERE Username = '" + Session["Username"].ToString() + "'";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
cmd.ExecuteScalar();
infoSpan.InnerText = String.Format("The users role has been updated to - {0}", radio1.SelectedValue);
}
}
}
}
//Method for checking the existence of the username in the database (retrun true or false)
private bool CheckUsername(string username)
{
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
string cmdText = "SELECT Count(*) FROM employee WHERE Username = '" + username + "'";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
// Open DB connection.
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
int count = (int)cmd.ExecuteScalar();
// True (> 0) when the username exists, false (= 0) when the username does not exist.
return (count > 0);
}
}
}
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
switch (Wizard1.WizardSteps[e.NextStepIndex].ID)
{
case "WizardStep2":
string username = TextBox1.Text;
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
//For checking the user
if (!String.IsNullOrEmpty(username) && CheckUsername(username))
{
try
{
Session["Username"] = username;
SqlConnection conn = new SqlConnection(connString);
conn.Open();
string cmdText = "SELECT * FROM employee WHERE Username = @Username";
SqlCommand myCommand = new SqlCommand(cmdText, conn);
myCommand.Parameters.AddWithValue("@Username", username);
DataTable table = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(myCommand);
adapter.Fill(table);
string name = table.Rows[0]["Name"] as string;
string jobtitle = table.Rows[0]["JobTitle"] as string;
string role = table.Rows[0]["Role"] as string;
lblName.Text = name;
lblJobTitle.Text = jobtitle;
lblRole.Text = role;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else
{
//If the user does not exist or a blank value has been entered
//Cancel the nextstep redirection and display an error message in a span
e.Cancel = true;
errorSpan.InnerText = "The user id specified is blank or does not exist";
}
break;
case "WizardStep3":
//Simply bind the radio list
radio1.SelectedValue = lblRole.Text;
break;
}
}
}
}
提示: 将连接字符串存储在web.config中:
<connectionStrings>
<add name="conn" connectionString="Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True"/>
</connectionStrings>
然后在代码中可以这样访问:
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
答案 1 :(得分:1)
正好回应你的评论。
我想我已经很好地了解了你希望如何调整代码。基本上只需要做几个内部联接来检索所需的信息并将角色id存储在会话变量中以进行更新在向导步骤3中可能。
我想注意的几件事
1)select查询只返回第一个结果(TOP(1)),您可以相应地更改它,如果您认为可能有多个结果从db返回,则可能带回转发器控件
2)在代码中使用内联查询并不是很灵活我会建议将它们移动到存储过程中(网上有关于如何执行此操作的示例)
3)而不是硬编码单选按钮列表选项而不是从数据库中的Roles表中检索它们,这样您就可以轻松添加\ remove角色而无需重新部署您的站点
<asp:Wizard ID="Wizard1" runat="server" DisplaySideBar="false" Width="80%" ActiveStepIndex="2"
OnNextButtonClick="Wizard1_NextButtonClick">
<WizardSteps>
<asp:WizardStep ID="WizardStep1" runat="server" Title="Employee Username/Network ID">
<table border="0">
<tr>
<td class="InputLabel">
Username:
</td>
<td class="InputControl">
<asp:TextBox ID="TextBox1" runat="server" />
</td>
<td>
<span id="errorSpan" runat="server" style="color:Red;"></span>
</td>
</tr>
</table>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep2" runat="server" Title="Manage User">
<div class="content">
<table>
<tr>
<td>
<asp:Label ID="lblName" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblDepartment" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblRole" runat="server"></asp:Label>
</td>
</tr>
</table>
</div>
</asp:WizardStep>
<asp:WizardStep ID="WizardStep3" runat="server" Title="Edit User Role">
<label for="role">
Current Role:
</label>
<asp:Label ID="Label1" runat="server" BackColor="#FFFF99" Font-Bold="True" ForeColor="#000099" />
<asp:RadioButtonList ID="radio1" runat="server" TextAlign="left">
<asp:ListItem id="option1" runat="server" Value="1" Text="Admin" />
<asp:ListItem id="option2" runat="server" Value="2" Text="Contribute" />
<asp:ListItem id="option3" runat="server" Value="3" Text="User" />
</asp:RadioButtonList>
<asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Clicked" />
<span id="infoSpan" runat="server" style="color:Red;"></span>
</asp:WizardStep>
</WizardSteps>
<HeaderTemplate>
<ul id="wizHeader">
<asp:Repeater ID="SideBarList" runat="server">
<ItemTemplate>
</ItemTemplate>
</asp:Repeater>
</ul>
</HeaderTemplate>
</asp:Wizard>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
private string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
protected void Page_Load(object sender, EventArgs e)
{
//Set the Wizard Step 1 as the initial wizard step when the page loads
if (!Page.IsPostBack)
{
Wizard1.ActiveStepIndex = 0;
}
}
protected void Button1_Clicked(object sender, EventArgs e)
{
//If one of the items is selected AND a username exists in the Username session object update the user role
if (!String.IsNullOrEmpty(radio1.SelectedValue) && Session["Username"] != null)
{
string cmdText = "UPDATE Userrole SET RoleId = '" + radio1.SelectedValue + "'" +
"WHERE Username = '" + Session["Username"].ToString() + "'";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
cmd.ExecuteScalar();
infoSpan.InnerText = String.Format("The users role has been updated to - {0}", radio1.SelectedItem.Text);
}
}
}
}
//Method for checking the existence of the username in the database (retrun true or false)
private bool CheckUsername(string username)
{
string cmdText = "SELECT Count(*) FROM users WHERE Username = '" + username + "'";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
// Open DB connection.
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
int count = (int)cmd.ExecuteScalar();
// True (> 0) when the username exists, false (= 0) when the username does not exist.
return (count > 0);
}
}
}
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
switch (Wizard1.WizardSteps[e.NextStepIndex].ID)
{
case "WizardStep2":
string username = TextBox1.Text;
//For checking the user
if (!String.IsNullOrEmpty(username) && CheckUsername(username))
{
try
{
Session["Username"] = username;
SqlConnection conn = new SqlConnection(connString);
conn.Open();
//string cmdText = "SELECT FROM employee WHERE Username = @Username";
string cmdText = "SELECT TOP(1) [Name],Department,RoleName,r.RoleId AS [RoleId] FROM users " +
"INNER JOIN userrole u on u.username = users.username " +
"INNER JOIN roles r on r.roleid = u.roleid " +
"WHERE users.username = @Username ";
SqlCommand myCommand = new SqlCommand(cmdText, conn);
myCommand.Parameters.AddWithValue("@Username", username);
DataTable table = new DataTable();
SqlDataAdapter adapter = new SqlDataAdapter(myCommand);
adapter.Fill(table);
string name = table.Rows[0]["Name"] as string;
string department = table.Rows[0]["Department"] as string;
string role = table.Rows[0]["RoleName"] as string;
Session["RoleId"] = table.Rows[0]["RoleId"];
lblName.Text = name;
lblDepartment.Text = department;
lblRole.Text = role;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else
{
//If the user does not exist or a blank value has been entered
//Cancel the nextstep redirection and display an error message in a span
e.Cancel = true;
errorSpan.InnerText = "The user id specified is blank or does not exist";
}
break;
case "WizardStep3":
//Simply bind the radio list if the list contains the role retrieved
var roleId = Session["RoleId"];
if (roleId != null && radio1.Items.FindByValue(roleId.ToString()) != null)
{
radio1.SelectedValue = Session["RoleId"].ToString();
}
break;
}
}
}
}