【发布时间】:2015-07-08 06:14:45
【问题描述】:
我已经提到 This ans 的 stackoverflow 它工作正常,但由于我在表单中采用了下拉列表,所以当第二个下拉列表填充第一个下拉列表中的选定值时,它会生效。如何保持该值??
这是我的代码。
查看
@{ Html.BeginForm("Create", "User", FormMethod.Post, new { enctype = "multipart/form-data" }); }
@Html.DropDownList("country", ViewData["Id"] as List<SelectListItem>, new { onchange = "this.form.submit();" })
@{ Html.EndForm(); }
@{ Html.BeginForm("Create", "User", FormMethod.Post, new { enctype = "multipart/form-data" }); }
@Html.DropDownList("state", ViewData["Id1"] as List<SelectListItem>, new { onchange = "this.form.submit();" })
@{ Html.EndForm(); }
@{ Html.BeginForm("Create", "User", FormMethod.Post, new { enctype = "multipart/form-data" }); }
@Html.DropDownList("city", ViewData["Id2"] as List<SelectListItem>, new { onchange = "this.form.submit();" })
@{ Html.EndForm(); }
控制器
public ActionResult Create()
{
FillCountry();
FillState();
FillCity();
return View();
}
[HttpPost]
public ActionResult Create(User ur)
{
string str = @"Data Source=DEV_3\SQLEXPRESS;Initial Catalog=DB_Naved_Test;Integrated Security=True";
SqlConnection con = new SqlConnection(str);
string query = "Insert into tblTest (Name,Email,MobileNo) values('" + ur.Name + "','" + ur.Email + "','" + ur.MobileNo + "')";
con.Open();
SqlCommand cmd = new SqlCommand(query, con);
cmd.ExecuteNonQuery();
con.Close();
TempData["msg"] = "<script>alert('Inserted Successfully');</script>";
ModelState.Clear();
FillCountry();
FillState();
FillCity();
return View();
}
public void FillCountry()
{
string str = @"Data Source=DEV_3\SQLEXPRESS;Initial Catalog=DB_Naved_Test;Integrated Security=True";
SqlConnection con = new SqlConnection(str);
string query = "select * from tblCountry ";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
List<SelectListItem> li = new List<SelectListItem>();
li.Add(new SelectListItem { Text = "Select", Value = "0" });
while (rdr.Read())
{
li.Add(new SelectListItem { Text = rdr[1].ToString(), Value = rdr[0].ToString() });
}
ViewData["Id"] = li;
}
public void FillState()
{
int id = Convert.ToInt16(Request["country"]);
string str = @"Data Source=DEV_3\SQLEXPRESS;Initial Catalog=DB_Naved_Test;Integrated Security=True";
SqlConnection con = new SqlConnection(str);
string query = "select * from tblState where cid='" + id + "'";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
List<SelectListItem> li = new List<SelectListItem>();
li.Add(new SelectListItem { Text = "Select", Value = "0" });
while (rdr.Read())
{
li.Add(new SelectListItem { Text = rdr[1].ToString(), Value = rdr[0].ToString() });
}
ViewData["Id1"] = li;
}
public void FillCity()
{
int id = Convert.ToInt16(Request["state"]);
string str = @"Data Source=DEV_3\SQLEXPRESS;Initial Catalog=DB_Naved_Test;Integrated Security=True";
SqlConnection con = new SqlConnection(str);
string query = "select * from tbl_cities where StateId='" + id + "'";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
List<SelectListItem> li = new List<SelectListItem>();
li.Add(new SelectListItem { Text = "Select", Value = "0" });
while (rdr.Read())
{
li.Add(new SelectListItem { Text = rdr[1].ToString(), Value = rdr[0].ToString() });
}
ViewData["Id2"] = li;
}
当我只使用两个下拉列表,即ddlCountry 和ddlState 并从ddlCountry 中选择国家/地区时,我的ddlSates 正在正确填充,但从ddlCountry 中选择的国家/地区正在发生变化。
【问题讨论】:
-
与问题无关,但尽量避免使用字符串连接的查询构造,而是使用参数化查询来避免 SQL 注入的危险。
-
@downvoter 有什么理由拒绝投票吗??
-
int id = Convert.ToInt16(Request["Id1"]);将失败,因为您没有名称属性为name="Id1"的控件,因此Request["Id1"]将始终为空。我猜你的模型没有名为Id的属性,所以你没有绑定到任何东西,在这种情况下你需要设置SelectListItem的Selected属性。我强烈建议您访问 MVC 站点并学习一些基本教程。 -
@Navy,那么您的问题中有错字 - 第二个下拉菜单必须是
@Html.DropDownList("Id1", ...)- 而不是"Id" -
我在第一条评论中指出了如何做到这一点。但是您的代码包含了我能想到的 MVC 中所有最糟糕的做法。在继续之前,您需要学习一些基础知识。
标签: c# asp.net-mvc-4