@ html.dropdownlist没有填充选定的值

时间:2013-08-02 11:49:27

标签: c# jquery asp.net-mvc-4 html-select

这里有两个下拉列表。第一个显示国家/地区列表,第二个列出第一个选定国家/地区的州值。值列表填充自 正确但在下拉列表中,未填充值 的 jQuery的:

 $(document).ready(function () {
        $("#Country").change(function () {
            var Id = $('#Country option:selected').attr('value');
            $("#Region").empty();
            $.getJSON("/ControllerName/GetRegionList",{ ID: Id  },
                function (data) {                    
                    jQuery.each(data, function (key) {
                        $("#Region").append($("<option></option>").val(ID).html(Name));
                    });
                });
        });
    });

查看:

 @Html.DropDownList("Country", new SelectList(Model.CountryList, "Value", "Text", Model.CountryList.SelectedValue))
 @Html.DropDownList("Region", new SelectList(Model.RegionList, "Value", "Text", Model.RegionList.SelectedValue))

控制器:

      public List<Region> GetRegionList(int ID)
        {
            int countryid = ID;           
            AddressModel objmodel = new AddressModel();
            List<Region> objRegionList = new List<Region>();
            objRegionList.Add(new Region { ID = "0", Name = " " });
            if (countryid != 0)
            {
                countryid = Convert.ToInt32(ID);
                SqlCommand cmd = new SqlCommand("USP_ProcedureName", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Id", countryid);
                cmd.Parameters.AddWithValue("@Mode", "Region");
                con.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    if (dr["RegionId"].ToString() != "")
                    {
                        objRegionList.Add(new Region { ID = dr["RegionId"].ToString(), Name = dr["Name"].ToString() });
                    }
                }
                dr.Close();
                con.Close();
            }
            return objRegionList;
        }

我的代码中有什么错误。?有什么建议。 编辑:添加了快照 empty ddl

1 个答案:

答案 0 :(得分:1)

在ASP.NET MVC控制器中,操作必须返回ActionResults。在您的情况下,您可以返回JSON:

public ActionResult GetRegionList(int id)
{
    var objRegionList = new List<Region>();
    objRegionList.Add(new Region { ID = "0", Name = " " });
    if (countryid != 0)
    {
        int countryid = ID;
        using (var conn = new SqlConnection("YOUR CONNECTION STRING COMES HERE"))
        using (var cmd = conn.CreateCommand())
        {
            con.Open();

            cmd.CommandText = "USP_ProcedureName";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Id", countryid);
            cmd.Parameters.AddWithValue("@Mode", "Region");
            using (var dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    if (dr["RegionId"].ToString() != "")
                    {
                        objRegionList.Add(new Region 
                        { 
                            ID = dr["RegionId"].ToString(), 
                            Name = dr["Name"].ToString() 
                        });
                    }
                }
            }
        }
    }

    return Json(objRegionList, JsonRequestBehavior.AllowGet);
}

请注意,我还清除了未使用的变量和不必要的Convert.ToInt32调用的代码,最重要的是在using语句中包装了IDisaposable资源,如SQL连接,命令和数据读取器,以避免资源泄漏。 / p>

然后在第一个下拉列表中包含控制器操作的url作为data-*属性,以避免在javascript中难以编码并在IIS中将应用程序部署到虚拟目录中时断开:

@Html.DropDownList(
    "Country", 
    new SelectList(Model.CountryList, "Value", "Text", Model.CountryList.SelectedValue),
    new { data_url = Url.Action("GetRegionList", "ControllerName") }
)

最终适应(简化)你的javascript:

$('#Country').change(function () {
    var regionDdl = $('#Region');
    regionDdl.empty();
    var id = $(this).val();
    var url = $(this).data(url);
    $.getJSON(url, { id: id }, function (data) {                    
        $.each(data, function (index, region) {
            regionDdl.append(
                $('<option/>', {
                    value: region.ID,
                    html: region.Name
                })
            );
        });
    });
});