是否可以在MasterPage中设置Container(ContentPlaceHolder),并在需要时隐藏它?
例如,我想为用户登录一个2个文本框和一个按钮,但如果会话仍在运行(即用户已经登录),我希望将这2个文本框和按钮更改为欢迎消息(例如:“欢迎,用户名”)。
MasterPage(注意:并非所有内容都已编码)
<%@ Import Namespace="System.Data.SqlClient" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<script runat="server">
Protected Sub Button1_Click(sender As Object, e As EventArgs)
Dim loginSQL As New SqlCommand
Dim loginComm As String
Dim CommonFunctions As New CommonFunctions()
Dim dec_pass As String = CommonFunctions.EncryptPassword(txtLoginPass.Text.Trim)
Dim conn As New SqlConnection("Data Source=BRIAN-PC\SQLEXPRESS;Initial Catalog=master_db;Integrated Security=True")
loginComm = "SELECT userid FROM users WHERE username=@username and password=@password"
conn.Open()
loginSQL = New SqlCommand(loginComm, conn)
loginSQL.Parameters.AddWithValue("@username", txtLoginUser.Text.ToString)
loginSQL.Parameters.AddWithValue("@password", dec_pass)
Dim dr As SqlDataReader = loginSQL.ExecuteReader()
If dr.HasRows Then
Session("userid") = dr("userid")
ElseIf dr.HasRows = False Then
lblRegister.ForeColor = Drawing.Color.Red
lblRegister.Text = "Incorrect Username/Password."
End If
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs)
If Session("userid") <> "" Then
txtLoginUser.Visible = False
txtLoginPass.Visible = False
Else
Dim conn As New SqlConnection("Data Source=BRIAN-PC\SQLEXPRESS;Initial Catalog=master_db;Integrated Security=True")
Dim useridComm As String = "SELECT name, surname FROM users WHERE userid=@userid"
Dim sqlUserID As New SqlCommand
conn.Open()
Dim userid As String = Session("userid")
sqlUserID = New SqlCommand(useridComm, conn)
sqlUserID.Parameters.AddWithValue("@userid", userid)
Dim datareader As SqlDataReader = sqlUserID.ExecuteReader()
lblLoggedIn.Text = "Welcome," + txtLoginUser.Text
End If
End Sub
</script>
<head>
<meta charset="utf-8" />
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<title></title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link rel="stylesheet" href="style.css" type="text/css" media="screen, projection" />
</head>
<body>
<form id="form1" runat="server">
<div id="wrapper">
<header id="header">
<strong>Header:</strong> Mobile CMS
</header>
<section id="login">
<div id="login-form">
<asp:ContentPlaceHolder id="ContentPlaceHolder2" runat="server">
<p>
<asp:Label ID="lblUsername" runat="server" Font-Bold="True" Text="U:"></asp:Label>
<asp:TextBox ID="txtLoginUser" runat="server" BorderStyle="None" BorderWidth="0px" Wrap="False"></asp:TextBox>
<asp:Label ID="lblUsername0" runat="server" Font-Bold="True" Text="P:"></asp:Label>
<asp:TextBox ID="txtLoginPass" runat="server" BorderStyle="None" BorderWidth="0px" TextMode="Password" Wrap="False"></asp:TextBox>
<asp:Button ID="btnLogin" runat="server" BorderStyle="None" OnClick="Button1_Click" Text="Login" />
</p>
<p>
<asp:Label ID="lblRegister" runat="server" Font-Bold="True" Font-Underline="True" ForeColor="#0000CC" Text="Register"></asp:Label>
<asp:ContentPlaceHolder ID="ContentPlaceHolder3" runat="server">
<asp:Label ID="lblLoggedIn" runat="server" Text=""></asp:Label>
</asp:ContentPlaceHolder>
</p>
</asp:ContentPlaceHolder>
</div>
</section>
<div class="navigation-bar">
<ul class="navigation-menu">
<li><a href="#" class="home">Home</a></li>
<li><a href="#" class="mainsettings">Settings</a></li>
<li><a href="#" class="profile">Profile</a>
<ul>
<li><a href="#" class="messages">Messages</a></li>
<li><a href="#" class="settings">Profile Settings</a></li>
</ul>
</li>
<li><a href="#" class="uploads">Uploads</a></li>
<li><a href="#" class="documents">Media</a>
<ul>
<li><a href="#" class="docs">Documents</a></li>
<li><a href="#" class="others">Others</a></li>
</ul>
</li>
<li><a href="#" class="projects">Projects</a>
<ul>
<li><a href="#" class="yprojects">Your Projects</a></li>
<li><a href="#" class="otherprojects">Other Projects</a></li>
</ul>
</li>
</ul>
</div>
<section id="middle">
<div id="container">
<div id="content">
<div>
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</div>
</div>
</section>
<footer id="footer">
<strong>Footer:</strong> adsfdsgfds
</footer>
</div>
</form>
</body>
</html>
答案 0 :(得分:1)
理想情况下,您希望使用ASP.Net LoginView
和LoginStatus
控件。
由于您只有一个页面,只需使用两个Panels
- 根据用户显示和隐藏是否经过身份验证。
注意:在这种情况下请勿使用ContentPlaceHolder
。
<强>更新强>
如果您想尝试,请参阅LoginView
的示例代码。这是一种更好的方式。
%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm6.aspx.cs"
Inherits="WebApplication2010.WebForm6" %>
<!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></title>
</head>
<body>
<form id="form1" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
<asp:Label ID="lblUsername" runat="server" Font-Bold="True" Text="U:"></asp:Label>
<asp:TextBox ID="txtLoginUser" runat="server" BorderStyle="None" BorderWidth="0px"
TextMode="Password" Wrap="False"></asp:TextBox>
<asp:Label ID="lblUsername0" runat="server" Font-Bold="True" Text="P:"></asp:Label>
<asp:TextBox ID="txtLoginPass" runat="server" BorderStyle="None" BorderWidth="0px"
TextMode="Password" Wrap="False"></asp:TextBox>
<asp:Button ID="btnLogin" runat="server" BorderStyle="None" OnClick="Button1_Click"
Text="Login" />
</AnonymousTemplate>
<LoggedInTemplate>
Welcome!
</LoggedInTemplate>
</asp:LoginView>
</form>
</body>
</html>
protected void Button1_Click(object sender, EventArgs e)
{
var txtLoginUser = LoginView1.FindControl("txtLoginUser") as TextBox;
var txtLoginPass = LoginView1.FindControl("txtLoginPass") as TextBox;
// Your authentication
// If validation is successful, create Authentication ticket
FormsAuthentication.SetAuthCookie(txtLoginUser.Text, false);
}
答案 1 :(得分:0)
首先,您在另一个ContentPlaceHolder
内有ContentPlaceHolder
,我看不出任何理由。
<asp:ContentPlaceHolder ID="ContentPlaceHolder3" runat="server">
<asp:ContentPlaceHolder id="ContentPlaceHolder2" runat="server">
对于手头的问题,我会隐藏ContentPlaceHolder
中包含的控件,具体取决于用户是否登录,而不是隐藏占位符,但这取决于您。我还会将userid
列添加到您的SQL查询中。
下面的内容应该让你开始吧,请注意这是未经测试的问题:
SELECT userid, username, password FROM users ....
If dr.HasRows Then
Session("userid") = dr("userid")
ElseIf dr.HasRows = False Then
lblRegister.ForeColor = Drawing.Color.Red
lblRegister.Text = "Incorrect Username/Password."
End If
现在你有了这个,你可以检查Page_Load
上的Session变量,看看用户是否已登录。
Protected Sub Page_Load(sender As Object, e As EventArgs)
If Session("userid") <> "" Then
txtLoginUser.Visible = False
txtLoginPass.Visible = False
Else
'Set your label text here, query the database to get the First and Second name of the user using the `userid`
End If
End Sub
修改强> 阅读完毕后,您需要关闭读者:
dr.Close()
和datareader.Close()
此行lblLoggedIn.Text = "Welcome," + txtLoginUser.Text
也必须是:
lblLoggedIn.Text = datareader("name").ToString() & " " &
datareader("surname").ToString()