如何与 Json 一起访问 ViewBag

how to access ViewBag together with Json

我在 Json 的帮助下通过 return 输入数据库值来实现自动完成功能,Linq.I 需要实现编辑功能。对于编辑功能,我需要 return viewBag 数据到我的视图。但是在 returning 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);
}

ViewBag 仅存在于 Razor 视图的上下文中,它本身仅在您返回 View()PartialView() 等时存在。如果您返回 JSON,这就是你得到的。您不能使用 ViewBag.

也就是说,我认为您对事物的运作方式大体上感到困惑。最初,您的应用使用 HTML 文档进行响应。其他所有内容,您的操作、视图等都是为了获取此 HTML 文档,该文档最终可以返回给客户端,在本例中为 Web 浏览器。

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

然后,您需要从服务器获取一些新信息。这需要来自客户端的新请求,这将导致来自服务器的新响应。该请求可能以用户在浏览器中导航的形式出现(在这种情况下,整个浏览器 window/tab 视图将发生变化)或以 AJAX 请求的形式出现,这会将当前视图留在浏览器 window/tab 原样。

XMLHttpRequest,负责发出 AJAX 请求的实际 JavaScript 客户端 class,就是所谓的 "thin client"。它发出请求并接收响应,但它不会 任何与所述响应相关的事情,与 "thick client" 类似的网络浏览器相反,它接受响应并执行所有对象模型创建和渲染。相反,回调函数只是被调用。您有责任根据收到的响应在该回调中执行某些操作(更新 DOM,等等)

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

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