Самое простое решение - добавить несколько iFrames под LB_Video. Не самое элегантное решение, но оно будет работать нормально и настолько просто, насколько вы можете это сделать ...
- Выберите оператор if / else
- Выполните рефакторинг с методом извлечения и создайте новый метод CreateVideoHtml, который можно вызывать несколько раз
- Измените «Текст» = на «Текст + =», чтобы можно было добавить несколько лотов HTML
- Добавить Where () вместо SingleOrDefault ()
- Добавить 'ToList ()' (возвращает все элементы) или 'Take (n)' (чтобы получить максимум n)
- Вызов нового метода CreateVideoHtml из цикла
Обратите внимание, что есть также проблема с вашим кодом - SingleOrDefault () может возвращать ноль, поэтому следующая строка (.Source) будет сброшена, если VG будет нулевым ... вам нужно следить за вещами, которые могут быть нулевыми!
Итак ...
public void YourMethod()
{
var sb = new StringBuilder();
var videoList = db.DT_Control_VideoGalleries.Where(x => x.PageControlID == int.Parse(HF_CPID.Value)).Take(3);
foreach(var video in videoList)
{
CreateVideoHtml(video);
}
foreach(var video in videoList)
{
CreateVideoHtml(video);
}
// Nothing returned from your query - CreateVideoHtml was never called!
if (LB_Video.Text == String.Empty)
{
LB_Video.Text = "No video!";
}
}
private void CreateVideoHtml(DT_Control_VideoGallery video)
{
if (video.Source.ToString() == "YouTube")
{
LB_Video.Text += "<iframe width=" + video.Width + "height=" + video.Height + "src=\"http://www.youtube.com/embed/" + video.ReferenceKey.Trim() + "frameborder=\"0\" allowfullscreen></iframe>";
}
else
{
LB_Video.Text += "<iframe width=\"" + video.Width + "\"height=\"" + video.Height + "\"frameborder=0\" src=\"http://player.vimeo.com/video/" + video.ReferenceKey.Trim() + "?title=0&byline=0\"></iframe>";
}
}
Обратите внимание, что если вы используете 'var' в объявлениях, это отделяет ваш код от определенных типов, то есть код может перемещаться более свободно. Далее, если у вас много видео, вам лучше использовать StringBuilder (из пространства имен System.Text). Для этого настройте вышеуказанное следующим образом:
public void RenderVideo()
{
var sb = new StringBuilder();
var videoList = db.DT_Control_VideoGalleries.Where(x => x.PageControlID == int.Parse(HF_CPID.Value)).Take(3);
foreach(var video in videoList)
{
// sb is passed in by reference, so we can see any changes here
CreateVideoHtml(sb, video);
}
// Nothing returned from your query - CreateVideoHtml was never called!
if (sb.Length == 0)
{
LB_Video.Text = "No video!";
}
else
{
LB_Video.Text = sb.ToString();
}
}
// this is static - all dependencies are passed in by reference
// the calling code can see the modifications to sb
// all this method does is create Html so you could unit test it
private static void CreateVideoHtml(StringBuilder sb, DT_Control_VideoGallery video)
{
if (video.Source.ToString() == "YouTube")
{
sb.Append("<iframe width=" + video.Width + "height=" + video.Height + "src=\"http://www.youtube.com/embed/" + video.ReferenceKey.Trim() + "frameborder=\"0\" allowfullscreen></iframe>");
}
else
{
sb.Append("<iframe width=\"" + video.Width + "\"height=\"" + video.Height + "\"frameborder=0\" src=\"http://player.vimeo.com/video/" + video.ReferenceKey.Trim() + "?title=0&byline=0\"></iframe>");
}
}
Рендеринг HTML в коде обработки строк никогда не является самым элегантным способом, но он будет надежно работать для вас, и также легко увидеть (из HTML), что было создано, поэтому легко увидеть, если что-то идет не так ....
Следующий рефакторинг, который вы можете попробовать, может быть
LB_Video.Controls.Add(new VideoControl(video));
... и пусть этот класс VideoControl обернет особенности того, как генерируется HTML.
Удачи и удачного кодирования!