Day 26 - 将 Yacht 後台储存资料提取後,送至前台渲染 OverView 版面内容区块 - 前台 Content Page 制作 - ASP.NET Web Forms C#

=x= 🌵 Yachts 前台页面 OverView - Content Page 後端功能制作。


OverView 内容区块资料分析介绍 :

📌 由於 Yachts 页面大部分都已制作成主版,我们只需要专注在内容页的处理 :

https://ithelp.ithome.com.tw/upload/images/20211010/20139487uJSLL6VefE.jpg

  1. 橘色区块 - 後台存为图文编辑,因为新型号没有太多资讯时会直接图文说明。
  2. 绿色区块 - 标题标签文字,後台存为型号字串,没尺寸资料时不显示尺寸区块。
  3. 紫色区块 - 表格标签内容,後台存为 JSON 资料。
  4. 蓝色区块 - 表格内嵌图面,後台存为图片档名资料,没图片资料时不显示。
  5. 粉色区块 - 连结标签及显示文字,後台存为 JSON 资料,没档案资料时不显示下载区块。


OverView - Content Page 页面後端实作 :

1. 於前台资料夹右键新增"使用主版页面的 Web Form" 并指定 Yachts.Master为主版。


2. 於内容区块内放入 OverView 分页内容程序码,并使用 asp:Literal 等修改参考如下

https://ithelp.ithome.com.tw/upload/images/20211010/20139487lgng1ki5Fr.jpg

https://ithelp.ithome.com.tw/upload/images/20211010/20139487BBD934qqkV.jpg


3. 於後置程序码 Page_Load 事件内加入读取内容方法 loadContent(); 参考如下

protected void Page_Load(object sender, EventArgs e)
{
    //会先跑 Content 页的 Page_Load 才跑 Master 页的 Page_Load
    if (!IsPostBack) {
        loadContent();
    }
}


4. 建立取得 OverView 分页内容 loadContent(); 方法逻辑如下

private void loadContent()
{
    //取得 Session 共用 GUID,Session 物件需转回字串
    string guidStr = Session["guid"].ToString();
    //依 GUID 取得游艇资料
    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 dimensionsTableHtmlStr = new StringBuilder();
    List<RowData> saveRowList = new List<RowData>();
    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();
        saveRowList = JsonConvert.DeserializeObject<List<RowData>>(loadJson);

        //渲染型号主要内容
        ContentHtml.Text = contentHtmlStr;

        //渲染 DIMENSIONS 尺寸资料区块 (第 3 笔开始才是尺寸资料)
        if (saveRowList?.Count > 2) {
            //渲染尺寸表型号标题
            string[] yachtModelArr = yachtModelStr.Split(' ');
            dimensionTitle.InnerText = yachtModelArr[1] + " DIMENSIONS";

            //加入渲染 DIMENSIONS 尺寸资料
            int count = 1;
            foreach (var item in saveRowList) {
                //第1笔是 Video 网址,第2笔是 Download 档名,从第3笔开始取
                if (count > 2) {
                    dimensionsTableHtmlStr.Append($"<tr><th>{item.SaveItem}</th><td>{item.SaveValue}</td></tr>");
                }
                count++;
            }
            //渲染尺寸表格文字内容
            DimensionsTableHtml.Text = dimensionsTableHtmlStr.ToString();

            //渲染尺寸表格图片内容,无图片时不执行
            if (!String.IsNullOrEmpty(dimensionsImgPathStr)) {
                DimensionsImgHtml.Text = $"<td><img alt='{yachtModelStr}' src='upload/Images/{dimensionsImgPathStr}' Width='278px' /></td>";
            }
        }
        else {
            //无尺寸资料则隐藏整个区块
            dimensionTable.Visible = false;
        }


        //渲染下方 Downloads 区块
        if (!String.IsNullOrEmpty(downloadsFilePathStr)) {
            string downloadsTitle = saveRowList[1].SaveValue;
            if (String.IsNullOrEmpty(downloadsTitle)) {
                //如果没设定 PDF 标题文字,则显示文字改为 PDF 档名
                downloadsTitle = downloadsFilePathStr;
            }
            //渲染下载连结
            DownloadsHtml.Text = $"<a id='HyperLink1' href='upload/files/{downloadsFilePathStr}' target='blank' >{downloadsTitle}</a>";
        }
        else {
            //无下载连结则隐藏整个区块
            divDownload.Visible = false;
        }
    }
    connection.Close();
}

//表格栏位 JSON 资料
public class RowData
{
    public string SaveItem { get; set; }
    public string SaveValue { get; set; }
}
  • 🌵 尺寸区及下载区如果没资料时要分别隐藏整个区块。


5. 模拟页面检查是否正确呈现,完成~



本日总结 :

📢 可以发现今天的实作内容好像还比昨天的主版内容少,因为主版里有太多东西而且不同分页都共用主版,这就是建立主版好用的地方,内容只要注意会出现新型号,资料还不多的时候,会只使用图文说明,或是尺寸没有附图及没有 PDF 档案,所以页面要跟着资料去做版面的变动。

  • 明日将介绍制作 Specification Manager - Content Page 後台的相关细节。

<<:  DAY25 - 展现成果,建立成果页面

>>:  [Day 26] 组件基础

Day 01 前言

这次有幸能藉由铁人赛重新认识及学习Arm的相关技术, 以下为这次参赛的课题以及时程(会再陆续更新完成...

[Day 1] 全民疯AI系列2.0-机器学习实战手册

全民疯AI系列2.0 第13届iT邦帮忙铁人赛 前言 哈罗大家好我是10程序中的10!我是上一届铁人...

Day21-Kubernetes 那些事 - Volume

前言 上一篇文章介绍了 ConfigMap 以及 Secrets 以及如何建立,接下来就要介绍如何正...

进击的软件工程师之路-软件战斗营 第十三周

学习进度 资料结构 泛型 通配字元 Android Studio RecyclerView Recy...

从零开始学3D游戏设计:入门程序实作 Part.2 杀死玩家

这是 Roblox 从零开始系列,入门章节的第八个单元,今天你将学会如何透过脚本来让玩家掉到岩浆上之...