C# 带字典的DevExtreme选择选项

C# 带字典的DevExtreme选择选项,c#,asp.net-mvc,razor,devexpress,devextreme,C#,Asp.net Mvc,Razor,Devexpress,Devextreme,我试图用字典填充DevExtremeSelectBox()(或Lookup()),但出现错误: 未捕获错误:E4006-ArrayStore“data”选项必须是数组 型号 public string Lang { get; set; } public Dictionary<string, string> Languages { get; } ... this.Lang = "es"; this.Languages = new Dictionary<string, str

我试图用
字典填充DevExtremeSelectBox()(或Lookup()),但出现错误:

未捕获错误:E4006-ArrayStore“data”选项必须是数组

型号

public string Lang { get; set; }
public Dictionary<string, string> Languages { get; }

...

this.Lang = "es";

this.Languages = new Dictionary<string, string>() { {"en", "English"},  {"ar", "Arabic"},     {"bn", "Bengali"},   {"cs", "Czech"},      {"da", "Danish"},    {"de", "German"},
                                                    {"el", "Greek"},    {"es", "Spanish"},    {"fa", "Persian"},   {"fi", "Finnish"},    {"fil", "Filipino"}, {"fr", "French"},
                                                    {"he", "Hebrew"},   {"hi", "Hindi"},      {"hu", "Hungarian"}, {"id", "Indonesian"}, {"it", "Italian"},   {"ja", "Japanese"},
                                                    {"ko", "Korean"},   {"msa", "Malay"},     {"nl", "Dutch"},     {"no", "Norwegian"},  {"pl", "Polish"},    {"pt", "Portuguese"},
                                                    {"ro", "Romanian"}, {"ru", "Russian"},    {"sv", "Swedish"},   {"th", "Thai"},       {"tr", "Turkish"},   {"uk", "Ukrainian"},
                                                    {"ur", "Urdu"},     {"vi", "Vietnamese"}, {"zh-cn", "Chinese (Simplified)"},         {"zh-tw", "Chinese (Traditional)"} };
public string Lang { get; set; }
public Dictionary<string, string> Languages { get; }
public List<Dictionary<string, string>> List { get; }

...

this.Lang = "es";

this.Languages = new Dictionary<string, string>() { {"en", "English"},  {"ar", "Arabic"},     {"bn", "Bengali"},   {"cs", "Czech"},      {"da", "Danish"},    {"de", "German"},
                                                    {"el", "Greek"},    {"es", "Spanish"},    {"fa", "Persian"},   {"fi", "Finnish"},    {"fil", "Filipino"}, {"fr", "French"},
                                                    {"he", "Hebrew"},   {"hi", "Hindi"},      {"hu", "Hungarian"}, {"id", "Indonesian"}, {"it", "Italian"},   {"ja", "Japanese"},
                                                    {"ko", "Korean"},   {"msa", "Malay"},     {"nl", "Dutch"},     {"no", "Norwegian"},  {"pl", "Polish"},    {"pt", "Portuguese"},
                                                    {"ro", "Romanian"}, {"ru", "Russian"},    {"sv", "Swedish"},   {"th", "Thai"},       {"tr", "Turkish"},   {"uk", "Ukrainian"},
                                                    {"ur", "Urdu"},     {"vi", "Vietnamese"}, {"zh-cn", "Chinese (Simplified)"},         {"zh-tw", "Chinese (Traditional)"} };

this.List = new List<Dictionary<string, string>>() { this.Languages };
我试过制作一个
列表
,它不会返回错误,但不会显示任何内容

型号

public string Lang { get; set; }
public Dictionary<string, string> Languages { get; }

...

this.Lang = "es";

this.Languages = new Dictionary<string, string>() { {"en", "English"},  {"ar", "Arabic"},     {"bn", "Bengali"},   {"cs", "Czech"},      {"da", "Danish"},    {"de", "German"},
                                                    {"el", "Greek"},    {"es", "Spanish"},    {"fa", "Persian"},   {"fi", "Finnish"},    {"fil", "Filipino"}, {"fr", "French"},
                                                    {"he", "Hebrew"},   {"hi", "Hindi"},      {"hu", "Hungarian"}, {"id", "Indonesian"}, {"it", "Italian"},   {"ja", "Japanese"},
                                                    {"ko", "Korean"},   {"msa", "Malay"},     {"nl", "Dutch"},     {"no", "Norwegian"},  {"pl", "Polish"},    {"pt", "Portuguese"},
                                                    {"ro", "Romanian"}, {"ru", "Russian"},    {"sv", "Swedish"},   {"th", "Thai"},       {"tr", "Turkish"},   {"uk", "Ukrainian"},
                                                    {"ur", "Urdu"},     {"vi", "Vietnamese"}, {"zh-cn", "Chinese (Simplified)"},         {"zh-tw", "Chinese (Traditional)"} };
public string Lang { get; set; }
public Dictionary<string, string> Languages { get; }
public List<Dictionary<string, string>> List { get; }

...

this.Lang = "es";

this.Languages = new Dictionary<string, string>() { {"en", "English"},  {"ar", "Arabic"},     {"bn", "Bengali"},   {"cs", "Czech"},      {"da", "Danish"},    {"de", "German"},
                                                    {"el", "Greek"},    {"es", "Spanish"},    {"fa", "Persian"},   {"fi", "Finnish"},    {"fil", "Filipino"}, {"fr", "French"},
                                                    {"he", "Hebrew"},   {"hi", "Hindi"},      {"hu", "Hungarian"}, {"id", "Indonesian"}, {"it", "Italian"},   {"ja", "Japanese"},
                                                    {"ko", "Korean"},   {"msa", "Malay"},     {"nl", "Dutch"},     {"no", "Norwegian"},  {"pl", "Polish"},    {"pt", "Portuguese"},
                                                    {"ro", "Romanian"}, {"ru", "Russian"},    {"sv", "Swedish"},   {"th", "Thai"},       {"tr", "Turkish"},   {"uk", "Ukrainian"},
                                                    {"ur", "Urdu"},     {"vi", "Vietnamese"}, {"zh-cn", "Chinese (Simplified)"},         {"zh-tw", "Chinese (Traditional)"} };

this.List = new List<Dictionary<string, string>>() { this.Languages };
数组存储“数据”选项必须是一个数组,表示您没有将正确的对象(即数组对象)传递到
选择框的数据源(请注意,
字典
不能直接转换为
数据源
对象所需的一维数组)

如果这是ASP.NET MVC中的DevExtreme,您可以尝试为语言列表创建基本模型类,如下所示:

public class Language
{
    public string LangID { get; set; }

    public string LangName { get; set; }
}
请注意,在目标viewmodel中必须有
List
属性,例如
List Languages{get;set;}
。然后构建语言列表,如下例所示:

控制器动作

this.Lang = "es";

this.Languages = new List<Language>() {
                     new Language { LangID = "en", LangName = "English" },
                     new Language { LangID = "el", LangName = "Greek" },
                     // other language definitions
                 };

// convert to JSON format and return this into view
this.LangArray = JsonConvert.SerializeObject(this.Languages);
附加说明:

如果仍要使用
字典
,请确保将其转换为符合JSON键值对格式的字符串

public static string ToJsonArray(this Dictionary<string, string> dict)
{
    var kvp = dict.Select(x => string.Format(@"""{0}"":""{1}""", x.Key, string.Concat(",", x.Value)));
    return string.Concat("{", string.Join(",", kvp), "}");
}

// Usage
this.LangArray = this.Languages.ToJsonArray();
ToJsonArray的公共静态字符串(此字典dict)
{
var kvp=dict.Select(x=>string.Format(@“{0}”):“{1}”,x.Key,string.Concat(“,”,x.Value));
返回string.Concat(“{”,string.Join(“,”,kvp),“}”);
}
//用法
this.LangArray=this.Languages.ToJsonArray();
参考资料:


好吧,我已经能够使用Linq解决这个问题,动态创建阵列:

i.AddSimple()
    .ColSpan(6)
    .Label(l => l.Visible(false))
    .DataField(Model.Lang)
    .Editor(ed => ed.SelectBox()
                    .DataSource(ds => ds.Array().Key("value").Data(Model.Languages.Select(s => new { value = s.Key, text = s.Value })))
                    .Value(Model.Lang)
                    .ValueExpr("value")
                    .DisplayExpr("text")
                    .Placeholder("Language..."));

我找到了一个解决办法。不漂亮,但变化少。无论如何谢谢你!另外,在
DataField
中,您希望传递字段的名称,而不是值,因此
.DataField(“Lang”)
。那么您就不再需要
.Value(Model.Lang)
i.AddSimple()
    .ColSpan(6)
    .Label(l => l.Visible(false))
    .DataField(Model.Lang)
    .Editor(ed => ed.SelectBox()
                    .DataSource(ds => ds.Array().Key("value").Data(Model.Languages.Select(s => new { value = s.Key, text = s.Value })))
                    .Value(Model.Lang)
                    .ValueExpr("value")
                    .DisplayExpr("text")
                    .Placeholder("Language..."));