如何与 JSON 一起访问 ViewBag



我在 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);
}

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

ViewBag只存在于 Razor 视图的上下文中,该视图本身仅在您返回View()PartialView()等时才存在。如果您要返回 JSON,这就是您得到的全部内容。您不能使用ViewBag

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

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

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

XMLHttpRequest,负责发出AJAX请求的实际JavaScript客户端类,被称为"瘦客户端"。它发出请求并接收响应,但它不会对所述响应执行任何操作,例如 Web 浏览器等"胖客户端",该客户端接受响应并执行所有对象模型创建和呈现。相反,仅调用回调函数。您有责任在该回调中对收到的响应执行某些操作(更新 DOM 等)

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

最新更新