我正在通过在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);
}
答案 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>