代码之家  ›  专栏  ›  技术社区  ›  Vikas

如何在级联下拉列表中显示所选值?

  •  1
  • Vikas  · 技术社区  · 16 年前

    我想为编辑视图中的选定值扩展以下代码。 以国家/地区-州-城市为例。

    我有脚本cascadingdropdownlist.js:

    function bindDropDownList(e, targetDropDownList) 
    {
        var key = this.value;
        var allOptions = targetDropDownList.allOptions;
        var option;
        var newOption;
        targetDropDownList.options.length = 0;
    
        for (var i=0; i < allOptions.length; i++) 
        {
            option = allOptions[i];
            if (option.key == key) 
            {
                newOption = new Option(option.text, option.value);
                targetDropDownList.options.add(newOption);
            }
        }
    }
    

    我有一个助手类:

    public static class JavaScriptExtensions
    {
        public static string CascadingDropDownList(this HtmlHelper helper, string name, string associatedDropDownList)
        {
            var sb = new StringBuilder();
    
            // render select tag
            sb.AppendFormat("<select name='{0}' id='{0}'></select>", name);
            sb.AppendLine();
    
            // render data array
            sb.AppendLine("<script type='text/javascript'>");
            var data = (CascadingSelectList)helper.ViewDataContainer.ViewData[name];
            var listItems = data.GetListItems();
            var colArray = new List<string>();
            foreach (var item in listItems)
                colArray.Add(String.Format("{{key:'{0}',value:'{1}',text:'{2}'}}", item.Key, item.Value, item.Text));
            var jsArray = String.Join(",", colArray.ToArray());
            sb.AppendFormat("$get('{0}').allOptions=[{1}];", name, jsArray);
            sb.AppendLine();
            sb.AppendFormat("$addHandler($get('{0}'), 'change', Function.createCallback(bindDropDownList, $get('{1}')));", associatedDropDownList, name);
            sb.AppendLine();
            sb.AppendLine("</script>");
    
            return sb.ToString();
    
        }
    }
    
    public class CascadingSelectList
    {
        private IEnumerable _items;
        private string _dataKeyField;
        private string _dataValueField;
        private string _dataTextField;
    
        public CascadingSelectList(IEnumerable items, string dataKeyField, string dataValueField, string dataTextField)
        {
            _items = items;
            _dataKeyField = dataKeyField;
            _dataValueField = dataValueField;
            _dataTextField = dataTextField;
        }
    
        public List<CascadingListItem> GetListItems()
        {
            var listItems = new List<CascadingListItem>();
            foreach (var item in _items)
            {
                var key = DataBinder.GetPropertyValue(item, _dataKeyField).ToString();
                var value = DataBinder.GetPropertyValue(item, _dataValueField).ToString();
                var text = DataBinder.GetPropertyValue(item, _dataTextField).ToString();
                listItems.Add(new CascadingListItem(key, value, text));
            }
            return listItems;
        }
    }
    public class CascadingListItem
    {
        public CascadingListItem(string key, string value, string text)
        {
            this.Key = key;
            this.Value = value;
            this.Text = text;
        }
    
        public string Key { get; set; }
        public string Value { get; set; }
        public string Text { get; set; }
    }
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Vikas    16 年前

    我已经做到了。其中所选值位于隐藏字段中。

    并确保您的控制器方法返回带有两个字段的JSON对象。

    <script type="text/javascript">
    
    var ddlCountry;
    var ddlStateID;
    
    function pageLoad() {
        ddlStateID = $get("StateID");
        ddlCountry = $get("CountryID");
        $addHandler(ddlCountry, "change", bindOptions);
        bindOptions();
    }
    function bindOptions() {
        ddlStateID.options.length = 0;
        var CountryID = ddlCountry.value;
        var stateSelected = document.getElementById('StateSelected').value;
        if (CountryID) {
            var url = "/Student/States/" + CountryID;
            $.getJSON(url, null, function(data) {
                $("#StateID").empty();
                $.each(data, function(index, optionData) {
                    if (stateSelected == optionData.ID) {
                        $("#StateID").append("<option value='"
                        + optionData.ID
                        + "' selected>" + optionData.Name
                        + "</option>");
                    }
                    else {
                        $("#StateID").append("<option value='"
                        + optionData.ID
                        + "'>" + optionData.Name
                        + "</option>");
                    };
                });
            });
        };
    }
    

    补充 控制器(我的URL是学生/州,即在学生控制器中,我输入以下代码)

    public ActionResult States(int id)
        {
            var states = db.states.Select(s => new { ID = s.ID, Name = s.Name }).OrderBy(s=>s.Name).ToList();
            return Json(states);
        }
    

    您可以返回任意数量的字段,但如果其中任何一个字段的值为空,那么它将不会在JSON对象中转换。我不确定,但当我返回整个状态对象时,它不起作用。当时状态表有一个名为deletedby的字段,它包含空值!。但是当我只返回两个“需要”字段时,它就正常工作了!