C # повторяющиеся данные помогают - PullRequest
1 голос
/ 21 июня 2011

Я только что создал свою первую попытку в видео-галерее, и мне интересно, как бы я мог показать более одного видео, при условии, что пользователь загружает больше !!!

Как это в настоящее время работает, так этоони вводят информацию о наборе в базу данных, а затем я перетаскиваю ее на страницу внутри литерала.

Вот код, стоящий за

DT_Control_VideoGallery VG = 
  db.DT_Control_VideoGalleries.SingleOrDefault(x => x.PageControlID == int.Parse(HF_CPID.Value));

if (VG.Source.ToString() == "YouTube")
{
    LB_Video.Text = "<iframe width=" + VG.Width + "height=" + VG.Height +
                    "src=\"http://www.youtube.com/embed/" + VG.ReferenceKey.Trim() +
                    "frameborder=\"0\" allowfullscreen></iframe>";
}
else
{
    LB_Video.Text = "<iframe width=\"" + VG.Width + "\"height=\"" + VG.Height +
                    "\"frameborder=0\" src=\"http://player.vimeo.com/video/" +
                    VG.ReferenceKey.Trim() + "?title=0&amp;byline=0\"></iframe>";
}

Теперь можно сказать, что у пользователяодно видео, которое они хотят показывать за раз, но как мне показать больше одного ???

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Самое простое решение - добавить несколько 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&amp;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&amp;byline=0\"></iframe>");
        }
    }

Рендеринг HTML в коде обработки строк никогда не является самым элегантным способом, но он будет надежно работать для вас, и также легко увидеть (из HTML), что было создано, поэтому легко увидеть, если что-то идет не так ....

Следующий рефакторинг, который вы можете попробовать, может быть

LB_Video.Controls.Add(new VideoControl(video)); 

... и пусть этот класс VideoControl обернет особенности того, как генерируется HTML.

Удачи и удачного кодирования!

1 голос
/ 21 июня 2011

Если вы измените запрос LINQ в конце, чтобы получить несколько элементов, и вам просто нужно добавить больше iframe s, вы, вероятно, можете сделать что-то вроде этого:

var VGs = db.DT_Control_VideoGalleries.Where(someSelector);
foreach( var VG in VGs )
{
  if (VG.Source.ToString() == "YouTube")
  {
    LB_Video.Text += "<iframe width=" + VG.Width + "height=" + VG.Height + "src=\"http://www.youtube.com/embed/" + VG.ReferenceKey.Trim() + "frameborder=\"0\" allowfullscreen></iframe>";
  }
  else
  {
    LB_Video.Text += "<iframe width=\"" +  VG.Width + "\"height=\"" + VG.Height + "\"frameborder=0\" src=\"http://player.vimeo.com/video/" + VG.ReferenceKey.Trim() + "?title=0&amp;byline=0\"></iframe>";
  }
}

Возможно, вам также следует использоватьStringBuilder для объединения строк и, в конце, в LB_Video.Text, но это должно показать вам концепцию как минимум.

...