ajax怎么实现母版页无刷新

a306843202 2015-09-04 01:05:08
母版页前台代码,我是在后台将菜单以<ul><li></li></ul>来拼接实现的

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="site.master.cs" Inherits="PCS.Site.MasterPage.site" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<link href="/css/ht_tabqiehuan.css" rel="stylesheet" />
<link href="/css/htcss.css" rel="stylesheet" />
<link href="/css/main.css" rel="stylesheet" />
<link href="/css/tuiguang.css" rel="stylesheet" />
<link href="/css/webwidget_scroller_tab.css" rel="stylesheet" />
<script src="/js/jquery-1.8.3.js"></script>
<script src="/js/msgBox.js"></script>
<script src="/js/common.js"></script>
<script type="text/javascript">
//定义提示框变量,可以在所有使用了此母版页的子页面中使用
var msgbox;
$(function () {
msgbox = new MsgBox({ imghref: "/imgs/" });
})
</script>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body class="body_index">
<div class="big_container">
<!--nav_begin-->
<div class="nav_content">
<div class="tg_header_top">
<div class="tg_header_logo">
<a href="/default.aspx">
<img alt="平台1" src="/images/logo.gif" />
</a>
</div>
<div class="tg_header_right">
<img alt="平台2" src="/images/biaoyu.gif" />
</div>
</div>
<div class="tg_nav">
<div class="tg_nav_list">
<ul>
<li style="color: wheat;">公告:XXX公司月销售额达到了300万 </li>
</ul>
</div>
</div>
</div>
<!-- nav_end-->
<div class="htcontainer">
<div class="htleft_nav leftfloat">
<div class="user_info">
<h1>管理</h1>
<div class="user_logined_info ">
<h2>您好:<span class="orange"><%=PCS.Page.Helper.UserManager.GetUInfo().u_real_name %></span><br />
</h2>
<div class="yhinfolink">
<a href="/Safe/SetSafe.aspx?type=setpassword">修改</a>
<a target="" href="/index.aspx">返回</a>
</div>
<div class="yhinfolink">
<a target="" href="/user/UserMessageList.aspx">未读消息 <span id="msgCount">()</span> </a><a target="_self" id="loginOut" href="/actions/logout.ashx" style="cursor: pointer;">退出</a>
</div>
</div>
</div>
<div id="container1" class="container">
<%= muns %>
</div>
</div>
<!--rightcontain-begin-->
<div class="rightcontainer rightfloat">
<asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
</asp:ContentPlaceHolder>
</div>

<!--rightcontain-end-->
</div>
</div>
<script type="text/javascript">
$(function () {
//给一级菜单绑定click事件
$(".menuTitle").click(function () {
//先将所有二级面板全部设置为关闭
$(".menuContent").removeClass("block");
//再当前点击的1级菜单下的二级菜单面板展开
$(this).next("div").addClass("block");
});
if (window.attachEvent) window.attachEvent("onload", navHover);
})
</script>
</body>
</html>


母版页后台代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace PCS.Site.MasterPage
{
using System.Text;
using PCS.BusinessLogicLayer;
using PCS.Entity;
using PCS.Page.Helper;
public partial class site : System.Web.UI.MasterPage
{
//负责拼接菜单标签
public StringBuilder muns = new StringBuilder(500);
//用来判断是否是第一个一级菜单,为了第一个菜单的二级菜单默认展开
int iFristMenu = 1;
protected void Page_Load(object sender, EventArgs e)
{

InitMenus();
}


//创建菜单列表
private void InitMenus()
{
//获取用户ID获取对应的权限菜单列表
IList<MenuEntity> mList = Menu_BLLSub.GetMenuByuid(UserManager.GetUInfo().u_id);
//通过递归来获取一级和二级菜单
//CreateMenus(mList, -1);
CreateLevel1Menu(mList);

}

private void CreateLevel1Menu(IList<MenuEntity> mList)
{
foreach (MenuEntity L1Menu in mList)
{
if (L1Menu.m_parent_mid < 0)
{
muns.Append("<div class=\"menuTitle\">" + L1Menu.m_name + "</div>");
CreateLevel2Menu(mList, L1Menu.m_id);
}
}
}

private void CreateLevel2Menu(IList<MenuEntity> mList,int m_id)
{
//为了设置菜单展开的属性
string block = "";
//如果是第一个菜单就让它展开
if (iFristMenu == 1)
{
block = "block";
iFristMenu++;
}
muns.Append("<div class=\"menuContent " + block + "\"><ul>");
foreach (MenuEntity L2item in mList)
{
if (L2item.m_parent_mid == m_id)
{
//生成二级菜单
muns.Append("<li class=\"menuContentItem\"><a href='" + L2item.m_url + "'>" + L2item.m_name + "</a></li>");
}

}
muns.Append("</ul></div>");
}
}
}



子页面套用模板


<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage/site.Master" AutoEventWireup="true" CodeBehind="settlelist.aspx.cs" Inherits="PCS.Site.admin.settle.settlelist" %>
<%@ Import Namespace="PCS.Page.Helper" %>



<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">

<%
if (UserManager.GetUInfo().ut_id == 2)
{
//允许当前的ASPX页面执行一个同一Web服务器上的指定ASPX页面
Server.Execute("settletgy.aspx"); /
}
else if (UserManager.GetUInfo().ut_id == 1)
{
Server.Execute("settlewb.aspx");
}
else
{
Server.Execute("settleadmin.aspx");
}
%>
</asp:Content>



当多个子页面切换的时候,模板菜单就会刷新,能使用什么办法让母版页不刷新,求案例!谢谢,现在等!
...全文
2127 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大湿级 2015-10-29
  • 打赏
  • 举报
回复
Hi 楼主 我也遇到你这问题了。我是在母版页上保存登录状态和登录用户。 <li><a> 后 母版页回归初始状态。 请问你解决这个问题了?
  • 打赏
  • 举报
回复
建议对于这种状况 1:组件式开发 2:iframe嵌套页面,无刷新的和又刷新的分开
木子李1212 2015-09-06
  • 打赏
  • 举报
回复
有时候用母版页确实限定了很多,用户控件相对较好一些;你可以把架构改一下,很好改的;这样就达到了楼上说的,动态加载不同区域
a306843202 2015-09-04
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
我们在编写 asp.net 的时候,随时要去点这个“测试button”,看看有没有页面状态丢失现象。如果有,就要立刻重新设计程序,不要再往下去做新的功能了。 如果向你这样,一大堆根本性的设计错误堆在一起,再来问“如何设计一个有状态的程序”,这其实就晚了。告诉你一点点,有什么用呢?骗得了自己骗不了主管和最终用户,因为他们早晚会指出你的页面有几十处类似的“交互操作后丢失了状态”的bug都需要修改。
好吧~~这是我第一次写项目,也许是有点缺陷,但是我其他对象都用了session保存起来了,问题是我想问清楚,母版页有没有办法异步请求或者通过其他办法保存状态,在用户点<li>的时候不随着子页面切换而刷新母版页到初始状态,以后我写程序会先全局考虑的,但这次大师,你就告诉我一下吧!谢谢了
  • 打赏
  • 举报
回复
我们在编写 asp.net 的时候,随时要去点这个“测试button”,看看有没有页面状态丢失现象。如果有,就要立刻重新设计程序,不要再往下去做新的功能了。 如果向你这样,一大堆根本性的设计错误堆在一起,再来问“如何设计一个有状态的程序”,这其实就晚了。告诉你一点点,有什么用呢?骗得了自己骗不了主管和最终用户,因为他们早晚会指出你的页面有几十处类似的“交互操作后丢失了状态”的bug都需要修改。
  • 打赏
  • 举报
回复
当整个页面服务器端重定向(Server.Execute)了,页面的状态自然就丢失了。再加上你的所谓的“ajax 驱动数据的菜单”根本没有将状态保存到页面中,也就更加不可能用到asp.net的 ViewState 状态自动管理功能。 只有两种比较干净的程序设计根本思路,它们是完全不同的道路: 1. 不要重定向页面,而应该是用 ascx 来动态加载页面上不同的局部区域。这样就能保持页面上许多控件的状态,以及页面自己的ViewState数据状态。 我们以前还在进行asp.net程序设计时,我们要求自始至终都要在页面上随时做一个简单的“安全测试”。就是拖入一个Button控件,产生点击回发事件。可以保持服务器端是“空”方法,什么都不用做,只是看看页面回发调试而已。然后你就看你的页面吧。当你点击这个按钮的时候,因为它在后台什么都不做,那么你就应该可能到页面上任何状态都没有丢失,例如任何动态改变过的控件颜色、样式都没有复原,任何动态的控件都没有丢失,任何状态看上去都没有错乱。如果你发现“根本不是这么回事儿”,那么就赶紧停下来吧。你在一个错误的道路上自己在做着根本没有状态的程序。 假设你的 settlewb.aspx 上面有一个 DropdownList,用户选择了其中一个项目,这时候如果你点击上面的“测试button”时页面刷新后用户的选择又被初始化了,那么我判断你根本没有学汇编写asp.net程序!这时候就不要写这么高大上的什么 Server.Execute("settlewb.aspx"); 之类的代码,先退回到更基础的方面去重新设计你的程序。 如果你觉得“保持asp.net程序的反复交互后的状态”是个很难学会的东西,你没有时间花6个月时间重新学习asp.net,那么就看考虑放弃asp.net。你可以使用js的功能,可以使用ajax,真正学习“前端开发”。但是要知道web前端开发技术 跟 asp.net 的服务器端的“一遍遍刷新页面”的机制天然是不匹配的。 2. 与asp.net机制完全相反的(实际上asp.net webform和asp.net mvc都是没用的)是,一个富客户端的js程序,它本来就是不刷新的单页面 js程序。它从服务器端获得了菜单数据(可能还包括菜单的html模板片段),然后在浏览器端渲染出菜单来。然后菜单选项被选中之后,它再从服务器端获得内容的数据对象(可能还包括内容部分的<div>模板片段),然后在浏览器端渲染出不同的内容来。这个过程中,它始终是在同一个页面上,并不刷新页面本身(而只是使用 js 代码来动态刷新 <div> 局部)。 这种程序就像是 v.6.cn 一样,这才是web前端开发技术。 我看你的情况,现在只能学习1。也就是说,你只能把重点放在“如何在aspx不变的情况下,去局部加载ascx内容”的技术。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧