как получить доступ к ViewBag вместе с Json - PullRequest
1 голос
/ 27 марта 2019

Я реализую функцию автозаполнения, возвращая значения базы данных с помощью Json и Linq. Мне нужно реализовать функцию редактирования. Для функциональности редактирования мне нужно вернуть данные viewBag в мое представление. Но я не мог получить доступ к своему viewBag при возврате результата Json.

        public JsonResult Index(string Prefix,int id = 0)
        {
            SqlConnection sqcon2 = new SqlConnection(conn);
            SqlCommand cmd2 = new SqlCommand();
            SqlDataAdapter sd2 = new SqlDataAdapter(cmd2);
            DataTable dt2 = new DataTable();
            cmd2.Connection = sqcon2;
            cmd2.CommandText = "sps_userLocationByID";
            cmd2.CommandType = System.Data.CommandType.StoredProcedure;
            cmd2.Parameters.AddWithValue("@id", id);
            sqcon2.Open();
            sd2.Fill(dt2);
            sqcon2.Close();
            foreach (DataRow dr2 in dt2.Rows)
            {
               ViewBag.cityName = dr2["CityName"].ToString();
                ViewBag.Name = dr2["Name"].ToString();
            }


            SqlConnection sqcon = new SqlConnection(conn);
            SqlCommand cmd = new SqlCommand();
            SqlDataAdapter sd = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            cmd.Connection = sqcon;
            cmd.CommandText = "sps_userCity";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            sqcon.Open();
            sd.Fill(dt);
            sqcon.Close();
            List<CityModel> ObjList = new List<CityModel>();
            foreach (DataRow dr in dt.Rows)
            {
                CityModel st = new CityModel();

                st.CityName = dr["CityName"].ToString();

                ObjList.Add(st);
            }
                      var CityName = (from N in ObjList
                            where 
                            N.CityName.ToLower().StartsWith(Prefix.ToLower())
                            select new { N.CityName });
            return Json(CityName, JsonRequestBehavior.AllowGet);
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

вы можете использовать viewbag, если вы вызываете другой метод Actionresult через Ajax.

0 голосов
/ 27 марта 2019

ViewBag существует только в контексте представления Razor, которое само существует, только если вы возвращаете View(), PartialView() и т. Д. Если вы возвращаете JSON, это все, что вы получите.Вы не можете использовать ViewBag.

Тем не менее, я думаю, что вы, в общем, запутались в том, как все работает.Изначально ваше приложение отвечает HTML-документом.Все остальное, ваши действия, представление и т. Д. - все о том, как добраться до этого HTML-документа, который в конечном итоге может быть возвращен клиенту, в данном случае веб-браузеру.

После отправки этого ответа.Сервер готов.Клиентский веб-браузер анализирует документ и создает различные объектные модели: DOM, CSSOM и т. Д. Затем он использует эти объектные модели для визуализации страницы (рисования).Во время и после этого процесса ваш JavaScript запускается.Все это происходит на стороне клиента, а сервер не знает и не заботится;он уже сделал свою работу.

Затем вам нужна новая информация с сервера.Это требует нового запроса от клиента, что приведет к новому ответу от сервера.Этот запрос может быть выполнен в форме навигации пользователем в браузере (в этом случае изменится весь вид окна / вкладки браузера) или в форме запроса AJAX, который оставляет текущий вид в окне / вкладке браузера как-is.

XMLHttpRequest, фактический клиентский класс JavaScript, отвечающий за выполнение AJAX-запросов, и называется «тонким клиентом».Он делает запросы и получает ответы, но он ничего не делает с указанным ответом, в отличие от «толстого клиента», такого как веб-браузер, который принимает ответ и выполняет все создание и рендеринг объектной модели.Вместо этого функция обратного вызова просто вызывается.Вы несете ответственность за то, чтобы что-то сделать в этом обратном вызове с полученным ответом (обновить DOM и т. Д.)имеет абсолютно нулевой смысл, потому что вид не меняется.Вы, кажется, представляете, что изменение ViewBag каким-то образом автоматически обновит что-то на странице, которая ранее была добавлена ​​с помощью ViewBag в вашем первоначальном представлении Razor.Дело не в этом, и дело обстоит не так.Если вы хотите что-то изменить на странице, новое значение должно возвращаться как часть ответа JSON от вашего запроса AJAX, а затем вы должны использовать это новое значение для соответствующего изменения DOM.

...