=x= 🌵 Yachts 前台页面 - Yachts - Master Page 後端功能制作。
📌 进到 Yachts 页面後会发现,点击游艇型号侧边栏画面会变动内容的包含 :
👺 从上面的拆分可以发现如果从绿色区块来看,他在切换内容分页时,不会变动的区块就是红色区块,所以红色区块我们就可以制作成 Master Page,而绿色区块则是 Content Page,但是因为区块如果点击游艇型号侧边栏则会对应改变红色跟绿色区块,因此主版页面的後置程序码需要处理这些变动的对应。
<head>
及<body>
内的内容分别复制到 .Master 档案中。
a. 紫色底线 : 用来隐藏上方轮播相簿,若要使用可参考下一步骤说明。
b. 红色区块 : 轮播相簿接收区块,使用 asp:Repeater 控制项 JavaScript 才能正确抓到。
👀 asp:Repeater 控制项用法官方参考 : Repeater 类别
👀 Eval() 用法官方参考 : DataBinder.Eval 方法
<head>
内自动产生用来接收 <head>
内容资料的控制项移至 <head>
标签内最下方
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack) {
//将型号对应 guid 存入 Session 与子页共用
getGuid(); //要放在 Init 不然 Content 页会去先去抓 Session 而抓不到
}
}
👺 用除错模式可以发现换页时是先读 Content 页,再读 Master 页,所以才放在 Init。
👺 执行顺序 : Content 页 Init > Master 页 Init > Content 页 Load > Master 页 Load。
private void getGuid()
{
//取得网址传值的型号对应 GUID
string guidStr = Request.QueryString["id"];
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TayanaYachtConnectionString"].ConnectionString);
string sql = "SELECT TOP 1 guid FROM Yachts";
SqlCommand command = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.Read()) {
//如果无网址传值就用第一笔游艇型号的 GUID
if (String.IsNullOrEmpty(guidStr)) {
guidStr = reader["guid"].ToString().Trim();
}
}
connection.Close();
//将 GUID 存入 Session 供上方列表共用
Session["guid"] = guidStr;
}
🌵 直接点 Yachts 页会无网址传值,直接用第一笔型号资料。
🌵 点侧边栏时会更新型号网址传值 GUID。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
loadGallery(); //读取并渲染上方相簿轮播
loadLeftMenu(); //读取并渲染左侧型号边栏
loadTopMenu(); //读取并渲染型号内容上方标题及分页列
}
}
private void loadGallery()
{
//建立资料表存资料
DataTable dataTable = new DataTable();
//新增表格栏位,预设从 1 开始, 设定栏位名称
dataTable.Columns.AddRange(new DataColumn[1] { new DataColumn("ImageUrl") });
//取得 Session 共用 GUID,Session 物件需转回字串
string guidStr = Session["guid"].ToString();
//依 GUID 取得游艇轮播图片资料
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TayanaYachtConnectionString"].ConnectionString);
string sql = "SELECT bannerImgPathJSON FROM Yachts WHERE guid = @guidStr";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@guidStr", guidStr);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
List<ImagePath> savePathList = new List<ImagePath>();
if (reader.Read()) {
string loadJson = HttpUtility.HtmlDecode(reader["bannerImgPathJSON"].ToString());
savePathList = JsonConvert.DeserializeObject<List<ImagePath>>(loadJson);
foreach (var item in savePathList) {
//逐一填入图片路径栏位值
dataTable.Rows.Add($"upload/Images/{item.SavePath}");
}
}
connection.Close();
//轮播图片必须用 Repeater 送不然 JavaScript 抓不到 HTML 标签会失败
//设定用 Eval 绑定的轮播图片路径资料
RepeaterImg.DataSource = dataTable; //设定资料来源
RepeaterImg.DataBind(); //刷新图片资料
}
//型号轮播图片 JSON 资料
public class ImagePath
{
public string SavePath { get; set; }
}
🌵 Repeater 的资料要先建立一个 DataTable 填完资料後,再指定给它。
👀 Repeater 用法参考官方 : Repeater 类别
👀 DataTable 用法参考官方 : DataTable 类别
👀 DataTable 使用方式参考 : [ASP.NET][C#][System.Data]建立/Create DataTable
private void loadLeftMenu()
{
string urlPathStr = System.IO.Path.GetFileName(Request.PhysicalPath);
//取得游艇型号资料
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TayanaYachtConnectionString"].ConnectionString);
string sql = "SELECT * FROM Yachts";
SqlCommand command = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
StringBuilder leftMenuHtml = new StringBuilder();
while (reader.Read()) {
string yachtModelStr = reader["yachtModel"].ToString();
string isNewDesignStr = reader["isNewDesign"].ToString();
string isNewBuildingStr = reader["isNewBuilding"].ToString();
string guidStr = reader["guid"].ToString();
string isNewStr = "";
//依是否为新建或新设计加入标注
if (isNewDesignStr.Equals("True")) {
isNewStr = "(New Design)";
}
else if (isNewBuildingStr.Equals("True")) {
isNewStr = "(New Building)";
}
leftMenuHtml.Append($"<li><a href='{urlPathStr}?id={guidStr}'>{yachtModelStr} {isNewStr}</a></li>");
}
connection.Close();
//渲染左侧游艇型号选单
LeftMenuHtml.Text = leftMenuHtml.ToString();
}
🌵 依型号标注判断类型加入文字标示於型号後方。
👺 连结位置要配合目前所在的内容分页设定,於 Video 页制作时,会建立如果跳转到没有影片连结的型号,会自动跳转成型号的 Overview 内容分页。
private void loadTopMenu()
{
//取得 Session 共用 GUID,Session 物件需转回字串
string guidStr = Session["guid"].ToString();
//依 GUID 取得游艇资料
List<RowData> saveRowList = new List<RowData>();
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TayanaYachtConnectionString"].ConnectionString);
string sql = "SELECT * FROM Yachts WHERE guid = @guidStr";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@guidStr", guidStr);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
StringBuilder topMenuHtmlStr = new StringBuilder();
StringBuilder dimensionsTableHtmlStr = new StringBuilder();
if (reader.Read()) {
string yachtModelStr = reader["yachtModel"].ToString();
string contentHtmlStr = HttpUtility.HtmlDecode(reader["overviewContentHtml"].ToString());
string loadJson = HttpUtility.HtmlDecode(reader["overviewDimensionsJSON"].ToString());
string dimensionsImgPathStr = reader["overviewDimensionsImgPath"].ToString();
string downloadsFilePathStr = reader["overviewDownloadsFilePath"].ToString();
//加入渲染型号内容上方分类连结列表
topMenuHtmlStr.Append($"<li><a class='menu_yli01' href='Yachts_OverView.aspx?id={guidStr}' >OverView</a></li>");
topMenuHtmlStr.Append($"<li><a class='menu_yli02' href='Yachts_Layout.aspx?id={guidStr}' >Layout & deck plan</a></li>");
topMenuHtmlStr.Append($"<li><a class='menu_yli03' href='Yachts_Specification.aspx?id={guidStr}' >Specification</a></li>");
//加入渲染型号内容上方分类连结列表 Video 分页标签,有存影片连结网址才渲染
saveRowList = JsonConvert.DeserializeObject<List<RowData>>(loadJson);
if (!String.IsNullOrEmpty(saveRowList[0].SaveValue)) {
topMenuHtmlStr.Append($"<li><a class='menu_yli04' href='Yachts_Video.aspx?id={guidStr}' >Video</a></li>");
}
//渲染画面
//渲染上方小连结
LabLink.InnerText = yachtModelStr;
//渲染标题
LabTitle.InnerText = yachtModelStr;
//渲染型号内容上方分类连结列表
TopMenuLinkHtml.Text = topMenuHtmlStr.ToString();
}
connection.Close();
}
//表格栏位 JSON 资料
public class RowData
{
public string SaveItem { get; set; }
public string SaveValue { get; set; }
}
📢 今天的内容可以复习如何设定主版页面,之前是在後台使用,这次是前台页面使用,这样可以大量减少重复的程序码内容,所有游艇型号内容分页共用相同逻辑的主版页面,里面侧边栏会依照目前所在内容分页而改变连结网址,是根据原始网站的模式,也可以都导回到各个型号的 Overview 页面会比较简单,但使用者操作体验较差,需要多做一次点选分页内容,才能比对不同型号的相同内容。
>>: 【25】ReLU 家族评比 个别使用ReLU LeakyReLU PReLU SELU 来训练
洗衣机,清洗着多少的脏污 旋转又旋转 时间一眨眼的就过去了... 你使用过自助洗衣或送洗服务吗? 家...
前言 各位早安,书接上回我们完成了 python 基本知识的介绍,今天我们要来介绍 html 也就是...
Chap.I 理论基础 Part 1:线性代数 1. Getting Started with Eq...
今天一开始,让我们先介绍一下,甚麽是关系运算子! 关系运算子 关系运算子顾名思义,就是用来比较两个变...
如何找到想要的工作? 一个寻找自己的旅程 西元2020年,全世界陷入新冠疫情的笼罩。每天都有上万的人...