下拉列表文本和值似乎不正确



我的代码发生了一些我无法弄清楚的奇怪事情:

<asp:DropDownList runat="server" ID="ddlMemberType" OnSelectedIndexChanged="ddlMemberType_OnSelectedIndexChanged" AutoPostBack="True"/>

var memberTypeListItems = memberType.Select(x => new KeyValuePair<string, string>(x.GetValue("Name").ToString(), x.GetValue("LongName").ToString()));
ddlMemberType.DataSource = memberTypeListItems;
ddlMemberType.DataBind();
ddlMemberType.DataTextField = "Value"; // No idea why I need to do this but it gets them the wrong way round otherwise
ddlMemberType.DataValueField = "Key";

这将生成以下 HTML:

<select name="p$lt$ctl03$pageplaceholder$p$lt$ctl00$pageplaceholder$p$lt$ctl02$BizForm$viewBiz$MembershipCostCalculator$ddlMemberType" onchange="javascript:setTimeout('__doPostBack('p$lt$ctl03$pageplaceholder$p$lt$ctl00$pageplaceholder$p$lt$ctl02$BizForm$viewBiz$MembershipCostCalculator$ddlMemberType','')', 0)" id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_pageplaceholder_p_lt_ctl02_BizForm_viewBiz_MembershipCostCalculator_ddlMemberType">
    <option value="Pharmaceutical">Pharmaceutical company (UK based or overseas)</option>
    <option value="Consultancy">Consultancy (UK based or overseas)</option>
    <option value="Associate">Freelance practitioner (sole trader)</option>
</select>

问题出在所选项目上。 ddlMemberType.SelectedItem产生:

Attributes: {System.Web.UI.AttributeCollection}
Enabled: true
Selected: true
Text: "[Pharmaceutical, Pharmaceutical company (UK based or overseas)]"
Value: "[Pharmaceutical, Pharmaceutical company (UK based or overseas)]"

文本和值属性完全关闭。方括号和逗号到底是怎么回事?另外,为什么键/值对的顺序错误,除非我将DataTextField设置为"Value",将DataValueField设置为"Key"?

我的数据库中的数据是这样的:

Name    LongName
=====================
Pharmaceutical  Pharmaceutical company (UK based or overseas)
Consultancy Consultancy (UK based or overseas)
Associate   Freelance practitioner (sole trader)

你需要交换你的代码行。文本和值字段的分配应在数据绑定之前进行,而不是在数据绑定之后进行:

ddlMemberType.DataSource = memberTypeListItems;
ddlMemberType.DataTextField = "Value";
ddlMemberType.DataValueField = "Key";
ddlMemberType.DataBind();

你现在的方式,当数据绑定发生时,下拉列表不知道哪个字段是值,哪个是文本,所以它在每个键值对上调用ToString

另外,为了解决代码中的注释:您需要告诉 DDL 如何处理它被正确馈送的对象,否则控件不知道对象的哪个属性是"文本"属性,哪个属性是"值"属性。因此,它尝试使用一些合理的默认值进行猜测,如果您的用例与这些默认值不匹配,则可能会失败。

在 DataBind 之前分配 DataTextField 和 DataValueField。

ddlMemberType.DataSource = memberTypeListItems;
ddlMemberType.DataTextField = "Value";
ddlMemberType.DataValueField = "Key";
ddlMemberType.DataBind();

绑定方式不正确 像这样绑定

var memberTypeListItems = memberType.Select(x => new SelectListItem { Text = x.Name, Value = x.LongName }), "Value", "Text");

并删除这些代码

ddlMemberType.DataTextField = "Value"; 
ddlMemberType.DataValueField = "Key";

最新更新