Каскадный раскрывающийся список MVC с использованием хранимых процедур для заполнения раскрывающегося списка

Итак, у меня есть два раскрывающихся списка, второй раскрывающийся список зависит от первого, следовательно, требуется каскадный стиль. У меня есть первый раскрывающийся список, заполненный с помощью хранимой процедуры, но я не уверен, как передать значение идентификатора первого раскрывающегося списка в хранимую процедуру, чтобы заполнить второй раскрывающийся список. У меня настроена хранимая процедура для второго раскрывающегося списка, но я не знаю, как вызвать ее в контроллере с передачей 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 в хранимую процедуру, но я не уверен, как обойти это, поскольку вместо этого я пытался ввести фактическое значение идентификатора и все еще получаю ту же ошибку.


person BodegaBlanco    schedule 02.03.2018    source источник
comment
Это ужасный код по многим причинам. Обратитесь к этой DotNetFiddle, чтобы узнать, как кодировать каскадные раскрывающиеся списки.   -  person    schedule 03.03.2018
comment
Оцените Fiddle, я впервые заполняю каскадные выпадающие списки из хранимых процедур, поэтому код повсюду. Я посмотрю, чтобы получить идеи о том, как очистить мой код.   -  person BodegaBlanco    schedule 03.03.2018


Ответы (2)


Я заработал, изменив Json.stringify на data: ({CountyList: $('#ddlCountyList').val()}), datatype: json,

Это работало при передаче выбранного значения родительского раскрывающегося списка в действие контроллера, которое, в свою очередь, заполняет второй раскрывающийся список.

person BodegaBlanco    schedule 03.03.2018
comment
Ответы идут в разделе ответов, а не в вопросе. Я откатил ваше редактирование. Отредактируйте это, чтобы включить свой ответ. - person ; 03.03.2018
comment
Ответ включен. - person BodegaBlanco; 03.03.2018

функция GetDistrictList() {

        $.ajax({
            url: '@Url.Action("TogetDistrictList", "getDistrict")',
            type: "POST",
            data: { CountyList: $('#countryId').val() },
            success: function(datas, textStatus, jqXHR) {
                if (datas != null) {
                    row = "";
                    row += "<option value='0'>--Select District---</option>";
                    $.each(datas,
                        function(i, v) {
                            row += "<option value='" + v.Value + "'>" + v.Text + "</option>";
                        })
                    $('#ddlDistrict').html(row);
                }
            },
            error: function(ex) {

            }
        });
    }
person Amal Sebastian    schedule 03.03.2018