Итак, у меня есть два раскрывающихся списка, второй раскрывающийся список зависит от первого, следовательно, требуется каскадный стиль. У меня есть первый раскрывающийся список, заполненный с помощью хранимой процедуры, но я не уверен, как передать значение идентификатора первого раскрывающегося списка в хранимую процедуру, чтобы заполнить второй раскрывающийся список. У меня настроена хранимая процедура для второго раскрывающегося списка, но я не знаю, как вызвать ее в контроллере с передачей SelectedValue первого раскрывающегося списка в качестве параметра. Вот мой код:
Контроллер:
public ActionResult CreateForm(){
List<SelectListItem> CountyList = new List<SelectListItem>();
List<SelectListItem> DistrictList = new List<SelectListItem>();
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString()))
{
con.Open();
using (SqlCommand cmd = new SqlCommand("dbo.USP_SELECT_COUNTY", con))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
CountyList.Add(new SelectListItem
{
Value = rdr[0].ToString(),
Text = rdr[1].ToString()
});
}
}
}
ViewBag.CountyList = new SelectList(CountyList.ToList(), "Value", "Text");
return View();
}
public ActionResult TogetDistrictList(string CountyList)
{
List<SelectListItem> DistrictList = new List<SelectListItem>();
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString()))
{
con.Open();
SqlParameter[] parameters = { new SqlParameter("@IDN_COUNTY", CountyList) };
SqlCommand cmd = CreateCommand("dbo.USP_SELECT_DISTRICT", parameters, con);
//using (SqlCommand cmd = new SqlCommand("dbo.USP_SELECT_DISTRICT", con))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
DistrictList.Add(new SelectListItem
{
Value = rdr[0].ToString(),
Text = rdr[1].ToString()
});
}
}
}
ViewBag.DistrictList = new SelectList(DistrictList.ToList(), "Value", "Text");
//DistrictList.Add(new SelectListItem { Text = "DistrictList1" + CountyList, Value = "DistrictList1" + CountyList });
return Json(CountyList.ToList(), JsonRequestBehavior.AllowGet);
}
public SqlCommand CreateCommand(string procedurename, SqlParameter[] parameters, SqlConnection connection)
{
SqlCommand cmd = new SqlCommand(procedurename, connection);
cmd.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter param in parameters)
{
if (param.Value == null)
param.Value = DBNull.Value;
cmd.Parameters.Add(param);
}
return cmd;
}
}
Вид:
<script type="text/javascript">
jQuery(function($){
$('#ddlCounty').change(function () {$.ajax('@Url.Action("TogetDistrictList")', JSON.stringify({CountyList: $("#ddlCounty").val()}) ).done(function(data){
$('#ddlDistrict').empty();
$.each(data,function(i,value){
$('#ddlDistrict').append($('<option/>').val(value.Value).text(value.Text))
})
});
});
});
</script>
@Html.DropDownList("ddlCounty", ViewBag.CountyList as SelectList})
@Html.DropDownList("ddlDistrict", Enumerable.Empty<SelectListItem>())
С приведенным выше кодом я получаю NullReferenceException во время отладки, я думаю, это потому, что выбранное раскрывающееся значение передается как NULL в хранимую процедуру, но я не уверен, как обойти это, поскольку вместо этого я пытался ввести фактическое значение идентификатора и все еще получаю ту же ошибку.