1

Доброй ночи!

Делаю тестовый проект по каталогу фильмов и столкнулся с проблемой вывода через ViewBag.

Сделал выбор 2х рандомных фильмов (по типу "вам бы понравилось") для показа на странице деталей выбранного фильма а так же реализовал отображение параметров выбранного фильма для "деталей". Но постоянно глючит ViewBag и вылетает в Studio с ошибкой, что там пусто. Не подскажете, как мне это можно оптимизировать? Еще у меня не вызывается метод фильтрации по имени-фамилии режиссера или актера, мне надо перенаправить всё это на главную страницу с применением фильтра.

код view'шки на гитхабе (как и сам проект)

https://github.com/e1ement/test/blob/master/MoviesApp/Views/Home/Details.cshtml

код в контроллере

        public ActionResult Details(int? id)
        {
            var movie = db.Movies.Find(id);
            if (movie == null)
            {
                return HttpNotFound();
            }
            var producer = db.Producers.Where(a => a.Id == movie.ProducerId);
            ViewBag.Producer = producer;
            var counter = db.Movies.Select(a => a.Id).Count();
            var random = new Random();
            var randomMovie1 = random.Next(Convert.ToInt32(counter));
            var randomMovie2 = random.Next(Convert.ToInt32(counter));
            if (randomMovie2 == randomMovie1)
            {
                randomMovie2 = random.Next(Convert.ToInt32(counter));
            }
            ViewBag.RandomMovie1 = db.Movies.Find(randomMovie1);
            ViewBag.RandomMovie2 = db.Movies.Find(randomMovie2);
            return View(movie);
        } 

Update: На 5-6 раз обновления страницы Details из представления вылетает в студию и пишет ошибку Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: "Не удается выполнить привязки исполняющей среды по нулевой ссылке", причем на любом из ViewBag может быть. Причем значение во ViewBag'е есть.

StackTrace

в CallSite.Target(Closure , CallSite , Object ) в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0) в CallSite.Target(Closure , CallSite , Object ) в ASP._Page_Views_Home_Details_cshtml.Execute() в C:\Users\Admin\source\repos\MoviesApp\MoviesApp\Views\Home\Details.cshtml:строка 121 в System.Web.WebPages.WebPageBase.ExecutePageHierarchy() в System.Web.Mvc.WebViewPage.ExecutePageHierarchy() в System.Web.WebPages.StartPage.RunPage() в System.Web.WebPages.StartPage.ExecutePageHierarchy() в System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) в System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) в System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) в System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) в System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) в System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)

e1ement
  • 153
  • Вы думаете. кто-то полезет на github рассматривать Ваш вью и догадываться. что означает "глючит ViewBag"? Вы уж постарайтесь вытащить весь маркап, имеющий отношение к вопросу, сюда, опишите шаги приводящие к ошибке, а также полный текст самой ошибки, желательно со StackTrace-ом. –  Jan 04 '18 at 01:14
  • Ok. На 5-6 раз обновления страницы Details из представления вылетает в студию и пишет ошибку Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: "Не удается выполнить привязки исполняющей среды по нулевой ссылке", причем на любом из ViewBag может быть. – e1ement Jan 04 '18 at 09:08
  • В тексте ошибки же ведь указано где место, вкотором падает ошибка "Details.cshtml:строка 121". Посмотрите какие объекты там используются, продебажте собственно код где эти объекты формируются и все станет ясно. – null Jan 04 '18 at 11:03
  • закомментировал строку, на 10е обновление страницы та же ошибка уже в CallSite.Target(Closure , CallSite , Object ) в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0) в CallSite.Target(Closure , CallSite , Object ) в ASP._Page_Views_Home_Details_cshtml.Execute() в C:\Users\Admin\source\repos\MoviesApp\MoviesApp\Views\Home\Details.cshtml:строка 76 в System.Web.WebPages.WebPageBase.ExecutePageHierarchy() – e1ement Jan 04 '18 at 13:58
  • дальше обновляю страницу и получаю в CallSite.Target(Closure , CallSite , Object ) в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0) в CallSite.Target(Closure , CallSite , Object ) в ASP._Page_Views_Home_Details_cshtml.Execute() в C:\Users\Admin\source\repos\MoviesApp\MoviesApp\Views\Home\Details.cshtml:строка 115 в System.Web.WebPages.WebPageBase.ExecutePageHierarchy() в – e1ement Jan 04 '18 at 14:00
  • причем даже в том ViewBag, который был объявлен в самой вьюхе, а не в контроллере. Дальнейшие эксперименты довели до того, что такая ошибка появилась в операторе foreach в in! Там то как такое может быть? – e1ement Jan 04 '18 at 14:05
  • Вы описываете какие-то чудеса, надо разбираться по порядку. У Вас id фильмов, по которым Вы ищете, идут без пропусков? Не может случайное значение id отсутствовать в базе? –  Jan 04 '18 at 14:24
  • много всего перепробовал: выделил в отдельный метод, избавился от всех ViewBag, добавил на вьюху через RenderAction частичное представление с рандомным фильмом и все равно та же проблема. Но в итоге понял, что проблема в самой функции Random, т.к. если я возвращаю модель с конкретным мной определенным параметром, то проблем нет. Как мне можно иначе возвращать рандомное значение id фильма? – e1ement Jan 04 '18 at 16:55
  • id по порядку, в базе не отсутствуют, разве что у меня нет id = 0, а рандом может же его возвратить... как мне учесть такой момент, что id может отсутсвовать? Мало ли в будущем какой-то фильм будет удален. var counter = db.Movies.Select(a => a.Id).Count(); var random = new Random(); var randomMovie = Convert.ToInt64(random.Next(counter)); – e1ement Jan 04 '18 at 16:57

2 Answers2

1

как решить проблему с отсутствием (удаленным из базы) id в базе пока не решил

Вот так:

var ids = db.Movies.Select(a => a.Id).ToList();

var idIndex1 = random.Next(ids.Count);
var idIndex2 = random.Next(ids.Count);
while (idIndex2 == idIndex1 && ids.Count > 1)
{
  idIndex2 = random.Next(ids.Count);
}
ViewBag.RandomMovie1 = db.Movies.Find(ids[idIndex1]);
ViewBag.RandomMovie2 = db.Movies.Find(ids[idIndex2]);

Ну и во вью следует проверять ViewBag.RandomMovie1 и ViewBag.RandomMovie2 на null.

  • спасибо. немного переработал, чтобы избавиться от ViewBag. Сделал отдельный метод и просто 2-ы его вызываю во вью. var counter = db.Movies.Select(a => a.Id).ToList(); var random = new Random(); var randomMovie = random.Next(1, counter.Count); return PartialView(db.Movies.Find(counter[randomMovie])); – e1ement Jan 05 '18 at 18:42
0

Проблема была в функции Random, т.к. id=0 у меня нет. Но как решить проблему с отсутствием (удаленным из базы) id в базе пока не решил.

e1ement
  • 153