=x= 🌵 Yachts 前台页面 Layout & deck plan / Video - Content Page 後端功能制作。
📌 Layout & deck plan 跟 Video 分页内容较简单,所以就一起介绍如何处理 :
protected void Page_Load(object sender, EventArgs e)
{
//会先跑 Content 页的 Page_Load 才跑 Master 页的 Page_Load
if (!IsPostBack) {
loadContent();
}
}
private void loadContent()
{
//取得 Session 共用 Guid,Session 物件需转回字串
string guidStr = Session["guid"].ToString();
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TayanaYachtConnectionString"].ConnectionString);
//依 Guid 取得型号资料
string sql = "SELECT layoutDeckPlanImgPathJSON FROM Yachts WHERE guid = @guidStr";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@guidStr", guidStr);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
StringBuilder layoutHtmlStr = new StringBuilder();
List<LayoutPath> saveImagPathList = new List<LayoutPath>();
if (reader.Read()) {
string loadImgJson = HttpUtility.HtmlDecode(reader["layoutDeckPlanImgPathJSON"].ToString());
//加入页面组图 HTML
saveImagPathList = JsonConvert.DeserializeObject<List<LayoutPath>>(loadImgJson);
foreach (var item in saveImagPathList) {
//加入每张图片
layoutHtmlStr.Append($"<li><img src='upload/Images/{item.SavePath}' alt='layout' Width='670px' /></li>");
}
//渲染画面
ContentHtml.Text = layoutHtmlStr.ToString();
}
connection.Close();
}
//页面组图 JSON 资料
public class LayoutPath
{
public string SavePath { get; set; }
}
<img>
属性加上 Width='670px'
避免图片太大超出画面。
🌵 点击复制後会将上方的 <iframe>
全选并复制。
👺 如果勾选启用隐私权加强保护模式,连结会变成 www.youtube-nocookie.com
但是这样做无法用於内嵌影片,请不要勾选。
<iframe>
程序码,将 <iframe>
的 src
属性内容改为 "#"
,并加入 id
及 runat="server"
参考如下🌵 需自行换算尺寸调整为适合页面的长宽比。
🌵 src="#"
为无意义连结,後面会带入各型号的连结。
protected void Page_Load(object sender, EventArgs e)
{
//会先跑 Content 页的 Page_Load 才跑 Master 页的 Page_Load
if (!IsPostBack) {
loadContent();
}
}
private void loadContent()
{
List<RowData> saveRowList = new List<RowData>();
//取得 Session 共用 Guid,Session 物件需转回字串
string guidStr = Session["guid"].ToString();
SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["TayanaYachtConnectionString"].ConnectionString);
//依 Guid 取得型号资料
string sql = "SELECT overviewDimensionsJSON FROM Yachts WHERE guid = @guid";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@guid", guidStr);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.Read()) {
string loadJson = HttpUtility.HtmlDecode(reader["overviewDimensionsJSON"].ToString());
saveRowList = JsonConvert.DeserializeObject<List<RowData>>(loadJson);
// List<T> 第一笔资料是放影片连结
string youtubeUrlStr = saveRowList[0].SaveValue;
//如果没有影片连结就导回 OverView 分页
if (String.IsNullOrEmpty(youtubeUrlStr)) {
Response.Redirect($"Yachts_OverView.aspx?id={guidStr}");
}
else {
//将取出的 YouTube 连结字串分离出 "影片 ID 字串"
//使用者如果是用分享功能复制连结时处理方式
string[] youtubeUrlArr = youtubeUrlStr.Split('/');
//使用者如果是直接从网址复制连结时处理方式
string[] vedioIDArr = youtubeUrlArr[youtubeUrlArr.Length - 1].Split('=');
//将 "影片 ID 字串" 组合成嵌入状态的 YouTube 连结
string strNewUrl = "https:/" + "/youtube.com/" + "embed/" + vedioIDArr[vedioIDArr.Length - 1];
//更新 <iframe> src 连结
video.Attributes.Add("src", strNewUrl);
}
}
connection.Close();
}
// JSON 资料
public class RowData
{
public string SaveItem { get; set; }
public string SaveValue { get; set; }
}
🌵 YouTube 连结需加入 /embed/
才是嵌入模式。
🌵 YouTube 分享功能的连结,最後一个反斜线之後的字串是影片的唯一 ID。
🌵 YouTube 浏览器网址的连结,最後一个等於符号之後的字串是影片的唯一 ID。
📢 今天的内容就是单纯的图片跟影片嵌入页面,影片嵌入的小细节只要仔细观察连结,就可以发现嵌入的连结跟一般分享的连结不同,还有不同影片最後面的字串不同,所以最後面的字串就是影片识别 ID,也做了如果使用者直接从网址复制连结的处理,另外,如果要设定自动拨放,要设成静音才能自动拨放。
<<: Chain of Responsibility 责任链模式
>>: [NestJS 带你飞!] DAY28 - CORS
Day 28 Easy x 2 LeetCode 100 题 待优化的两题 Guess Number...
前言 发现无法轻易取得股票资讯,但换个念头,这应该是市场上所有的资料吧,剩下就是要进行筛检。不过今天...
今天太晚回家,文章要开天窗拉! 先简单分享一下,我在初期在管理元件的时候,也对於命名这件事情感到有点...
想当一个 Good PHPer,不但要写程序、写注解还要写 API 文件,想到要维护三个地方工程师就...
Variables 在Sass中,开发者可以使用变数,例如可以将常用的颜色、宽度设定成变数,这样未来...