目录
1、想实现不止鼠标滑过就显示图片,初始化状态下也可以显示图片,且每个图片还会自动变化,该如何实现
2、 同一个项目下的网页之间可以直接在地址栏输入跳转到阅读界面从而实现在这个跳转,那么如何防止这种现象呢?
3、如何根据下拉框里的选择,显示选择的这个类型的所有文章,然后在这些书籍中选一个进行阅读
4、如何让上面3的显示显示在下面的某个区域,而不是最上方
待解决问题
1、想实现不止鼠标滑过就显示图片,初始化状态下也可以显示图片,且每个图片还会自动变化,该如何实现
前面一篇我们说到”实现鼠标扫过书籍的名字就可以显示它的封面“这个问题的解决,是使用 JavaScript 来实现鼠标悬停在字母上时显示对应的图片,然后在html中添加 <img>
标签实现的。
而现在这个问题是在前一个问题的基础上改进了一下,所以直接在原来的代码基础上加上自动变换图片这个功能即可,使用Javascript实现自动变化和鼠标滑过显示图片代码如下:
<script>var imageIndex = 0; // 用于自动变换图片的索引var bookTitles = ['活着', '疯人说', '被讨厌的勇气', '风雨里做个大人,阳光下做个小孩']; // 书籍标题数组// 初始化显示第一张图片window.onload = function () {showImage(bookTitles[imageIndex]);setInterval(changeImage, 5000); // 每5秒自动变换图片};// 切换图片函数function changeImage() {imageIndex = (imageIndex + 1) % bookTitles.length;var nextBookTitle = bookTitles[imageIndex];showImage(nextBookTitle);}// 显示图片的函数function showImage(bookTitle) {// 获取对应书籍的图片路径var imagePath = '';switch (bookTitle) {case '活着':imagePath = '/bookimages/huozhe.png'; break;case '疯人说':imagePath = '/bookimages/fengrenshuo.png'; break;case '被讨厌的勇气':imagePath = '/bookimages/beitaoyan.png'; break;case '风雨里做个大人,阳光下做个小孩':imagePath = '/bookimages/manhua1.jpg'; break;default:// 如果没有对应的图片路径,则不显示图片imagePath = '/bookimages/manhua1.jpg';return;}// 获取图片元素并设置图片路径var imgElement = document.getElementById('hoverImage');imgElement.src = imagePath;// 显示图片imgElement.style.display = 'block';}// 隐藏图片的函数function hideImage() {// 获取图片元素并隐藏document.getElementById('hoverImage').style.display = 'none';}</script>
2、 同一个项目下的网页之间可以直接在地址栏输入跳转到阅读界面从而实现在这个跳转,那么如何防止这种现象呢?
例如,在我的这个项目中,要实现的是普通用户无法跳转到admin界面,但是管理员可以跳转。这时,就需要在admin.aspx.cs文件下设置:
protected void Page_Load(object sender, EventArgs e)
{// 检查用户是否登录if (Session["UserID"] == null){// 如果用户未登录,重定向到登录页面Response.Redirect("login.aspx");}else{// 检查用户是否具有管理员权限(这里假设管理员权限存储在Session中的UserType中)if (Session["UserID"].ToString() != "admin"){// 如果用户不是管理员,重定向到其他页面(如阅读界面)Response.Redirect("read.aspx");}// 如果用户登录且具有管理员权限,则允许访问管理员界面}
}
但是通过这个问题,我突然意识到一个问题,我是设定了一个专门的账号作为管理员账号,但是若是管理员很多,那么就需要将用户的那个表拆分成好几个表,一个普通用户,一个管理员,还有一个就是用户身份表,这个后面有时间再修改吧,暂且就先使用一个特定的号吧。
另外,我还有一个错误,就是注册帐号之后没有跳转,按理说注册成功之后应该直接跳转到登陆界面直接登录的,所以在此修改一下,修改成直接跳转。
Response.Write("<script>alert('添加成功,请登录账号');window.location.href = 'login.aspx';</script>");
3、如何根据下拉框里的选择,显示选择的这个类型的所有文章,然后在这些书籍中选一个进行阅读
首先设置下拉框中的value值,然后直接根据value值进行操作:
然后直接使用就可以了。
4、如何让上面3的显示显示在下面的某个区域,而不是最上方
如果要实现这个操作,那么就得修改程序,修改为:使用 StringBuilder
加上 LiteralControl方式。
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{// 检查用户是否已经登录if (!IsUserLoggedIn()){// 如果用户未登录,则小窗口提示,然后重定向到登录页面Response.Write("<script>alert('请先登录之后再进行操作');window.location.href = 'login.aspx';</script>");}else{//下面就根据下拉框的选择,显示相应的书籍,然后在该显示的所有书籍中选择想要查看的进行查看详细信息。myconnection.Open();string sqlcmd = "SELECT bookname, author FROM books WHERE typeid = @selectedValue";SqlCommand mycommand = new SqlCommand(sqlcmd, myconnection);mycommand.Parameters.AddWithValue("@selectedValue", selectedValue);SqlDataReader myreader = mycommand.ExecuteReader();// 创建一个 StringBuilder 对象用于构建书籍列表 HTMLStringBuilder sb = new StringBuilder();// 开始书籍列表区域的输出sb.Append("<div class=\"book-list\">");sb.Append("你所查询的书籍有:<br>");sb.Append("<table border=1px>");sb.Append("<tr>");//表示行for (int i = 0; i < myreader.FieldCount; i++)//使用FieldCount获取当前行中的列数{sb.Append("<td>" + myreader.GetName(i) + "</td>");//td表示列,使用GetName获取每一列的名称}sb.Append("<td>操作1</td>");//读完数据库中的数据名称之后,在表格中添加表头为操作的一列sb.Append("</tr>");//下面就是读数据库中的每一行内容,然后输出,按行读即read方法,然后使用FieldCount获取当前行中的列数,然后依次输出while (myreader.Read()){sb.Append("<tr>");for (int i = 0; i < myreader.FieldCount; i++){sb.Append("<td>" + myreader[i].ToString() + "</td>");}sb.Append("<td><a href='novel.aspx?id=" + myreader.GetValue(0) + "'>查看详细信息</a></td>");sb.Append("</tr>");}sb.Append("</table>");// 结束书籍列表区域的输出sb.Append("</div>");myconnection.Close();// 将构建好的 HTML 内容输出到 BookListPanel 中BookListPanel.Controls.Add(new LiteralControl(sb.ToString()));}
}
原因如下:
在 ASP.NET Web Forms 中,Response.Write 直接向输出流写入内容,通常用于在页面生命周期的早期输出静态内容。然而,如果你想将动态生成的 HTML 添加到一个特定的控件(如 <asp:Panel>)中,Response.Write 可能会导致不可预期的结果,例如:
- 内容可能不在预期的位置,特别是如果在页面生命周期中后期使用 Response.Write。
- 它可能导致部分内容在页面控件之外输出,从而导致页面结构混乱。
StringBuilder 用于构建一段较长的字符串,然后将该字符串添加到某个控件中。这种方式确保了输出内容被放置在预期的位置,并且减少了向客户端传输的数据量(因为只进行一次控件更新)。
如果想在 <asp:Panel> 中添加内容,建议使用 StringBuilder 并通过 LiteralControl 将最终的内容添加到控件中,这样可以确保内容准确地插入到指定的 Panel 中。不过,如果希望直接使用 Response.Write 向页面输出内容,可以这么做,但要注意其在页面生命周期中的位置,确保不会导致内容错位。对于复杂的动态页面内容,直接使用 Response.Write 可能导致意外问题。
综上所述,使用 StringBuilder 加上 LiteralControl 是一种更可控、更可靠的方式,可以确保内容添加到指定的控件中并且不会干扰页面其他部分的结构。所以,虽然你可以使用 Response.Write 来输出内容,但为了确保内容被正确定位到特定控件内,并避免页面结构混乱,使用 StringBuilder 和 LiteralControl 是更好的做法。
今天就解决了这一点,就先这样吧。
待解决问题
?如何删除运行的缓存问题,因为每次运行之后,样式表的格式就算改变了,也不会影响显示的样式,应该是缓存问题,所以应该如何修改
?点击首页显示的书籍,如何按照点击的名称,进入相应的书籍简介呢
?怎么实现点击书籍,进入阅读界面,然后开始阅读呢
首先肯定得先写个数据库来存储,然后至于怎么显示,就是一个问题。
?在read界面下显示选择的下拉框里的书籍,然后在这些书籍中添加一个查看详细信息,点击查看详细信息之后跳转到novel界面,使用下面的开始阅读进入书籍的内容,然后开始阅读。
目前,novel网页中的代码是错误的,需要修改。
?点击某个书籍,如果是跳转到一个新的网页,那书多了得写很多个网页,所以跳转的方式肯定不是直接跳转到某个固定页面,那么该如何实现跳转
?我想要实现跳转的是一个界面,只是编号不同,该怎么实现呢?(几种不同的书籍,好像可以通过UserControl实现。)
?不支持MasterPageFile="~/MasterPage.master"吗?为什么
?如何实现bookListPlaceholder这种方式下的
?如何使得DropDownList中的某个选择还能继续向下选