如何与Json一起访问ViewBag

时间:2019-03-27 12:49:15

标签: asp.net-mvc asp.net-mvc-3 asp.net-core asp.net-mvc-5

我正在通过在Json和Linq的帮助下返回数据库值来实现自动完成功能。我需要实现编辑功能。对于编辑功能,我需要将viewBag数据返回到我的视图。但是我在返回Json结果时无法访问viewBag。

        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 :(得分:1)

如果通过Ajax调用另一个Actionresult方法,则可以使用viewbag。

答案 1 :(得分:0)

ViewBag仅存在于Razor视图的上下文中,该视图本身仅在您返回View()PartialView()等时才存在。如果您返回JSON,仅此而已你得到。您不能使用ViewBag

那是说,我认为您总体上对事情的运作方式感到困惑。最初,您的应用使用HTML文档进行响应。其他所有内容,您的操作,视图等都与获取此HTML文档有关,最终可以将其返回给客户端(在这种情况下为Web浏览器)。

一旦发送了回复。服务器完成。在客户端,Web浏览器解析文档并创建各种对象模型:DOM,CSSOM等。然后,使用这些对象模型来呈现页面(绘画)。在此过程中及之后,您的JavaScript将运行。所有这些都是在客户端发生的,服务器不知道或不在乎;它已经完成了工作。

然后,您需要服务器中的一些新信息。这需要来自客户端的新请求,这将导致来自服务器的新响应。该请求可能以用户在浏览器中导航的形式出现(在这种情况下,整个浏览器窗口/选项卡视图都会改变),也可能以AJAX请求的形式出现,从而将当前视图留在浏览器窗口/选项卡中。 -是。

XMLHttpRequest是负责发出AJAX请求的实际JavaScript客户端类,即所谓的“瘦客户端”。它发出请求并接收响应,但是对于诸如Web浏览器这样的“胖客户端”,它不执行任何带有所述响应的操作,而是接收响应并执行所有对象模型的创建和渲染。 。相反,仅调用回调函数。您有责任在回调中使用收到的响应(更新DOM等)来执行某些操作

所有这一切都意味着在返回对AJAX请求的JSON响应的同时使用ViewBag进行任何操作绝对没有意义,因为视图没有改变。您似乎在想ViewBag的更改将以某种方式自动更新页面上先前通过初始ViewBag在您的初始Razor视图中添加的内容。事实并非如此,事情也不是这样。如果要更改页面上的某些内容,则需要将新值作为AJAX请求的JSON响应的一部分返回,然后必须使用该新值来相应地更改DOM。 / p>