【问题标题】:How do I display selected value in a cascading drop down list?如何在级联下拉列表中显示选定的值?
【发布时间】:2009-04-13 16:00:04
【问题描述】:

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

我有脚本 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; }
}

【问题讨论】:

    标签: .net asp.net asp.net-mvc


    【解决方案1】:

    我已经做到了。选择的值在隐藏文件中。

    并确保您的控制器方法返回带有两个字段的 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>");
                    };
                });
            });
        };
    }
    

    添加 控制器(我的网址是学生/州,即在学生控制器中我输入以下代码)

    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的字段,它包含空值!。但是当我只返回两个“需要”字段时,它就可以正常工作了!

    【讨论】:

    • 请您发布您的控制器方法,它返回带有两个字段的 json 对象?
    猜你喜欢
    • 2015-01-31
    • 2014-06-06
    • 1970-01-01
    • 2015-09-14
    • 2020-07-10
    • 1970-01-01
    • 2021-09-27
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多