例如,我希望用户为给定的团队创建一个新的粉丝俱乐部。
显然,必须将团队加载到DropDownList中,以便从预先设定的选择组中选择它们。团队列表从数据库返回。
截至目前,我正在做这样的事情:
//FindAll() returns IQueryable<Team>
var Teams = teamsRepo.FindAll().AsEnumarable();
myDropDownList.DataTextField = "Name";
myDropDownList.DataValueField = "ID";
myDropDownList.DataSource = Teams;
myDropDownList.DataBind();
不幸的是,当这样做时,我没有强类型属性,因此存在拼写错误拼写ValueField或TextField的风险。
尝试获取DropDownList的选定值时也存在问题。使用以下代码,无论选择哪个团队,所有内容都将以ID 1保存。
fansite.IDTeam = myDropDownList.SelectedIndex;
有关如何改进的任何建议?
答案 0 :(得分:2)
从您的问题看来,您似乎关心代码中数据绑定的硬编码字符串。同样的事情也让我疯狂。
有一种使用lambda方法和表达式树的好方法,它可以让你摆脱硬编码的字符串并以强类型的方式获取属性名称:
您可以使用此类和扩展方法...
public class Nameof<T>
{
public static string Property<TProp>(Expression<Func<T, TProp>> expression)
{
var body = expression.Body as MemberExpression;
if(body == null)
throw new ArgumentException("'expression' should be a member expression");
return body.Member.Name;
}
}
...这将允许您执行以下操作:
//instead of myDropDownList.DataTextField = "Name";
myDropDownList.DataTextField = Nameof<Team>.Property(t => t.Name);
//instead of myDropDownList.DataValueField = "ID";
myDropDownList.DataValueField = Nameof<Team>.Property(t => t.ID);
这就是我喜欢看到的;看不到硬编码的字符串文字! : - )
答案 1 :(得分:1)
(这是在ASP.Net澄清之前写的,我已经从一个winforms人员那里回答了。)
我不确定您的Teams
ID是什么样的,但如果它们不是顺序的,零基础且没有间隙,使用myDropDownList.SelectedIndex;
会给您错误的数据。
我认为你最后一行应该是:
fansite.IDTeam = myDropDownList.SelectedValue;
在要使用的数据类型上,我通常使用Dictionary<int, string>
作为下拉列表,并使用一些辅助扩展方法来使人口更好。
答案 2 :(得分:1)
这正是.NET数据绑定的工作方式,您必须输入属性名称。
您始终可以将转换器添加到组合框项目,然后调用add(ms-doc)
获取所选项目的值时,请尝试以下操作:
fansite.IDTeam = myDropDownList.SelectedValue;
答案 3 :(得分:0)
您应该考虑使用ObjectDataSource
或LinqDataSource
之类的DataSource来控制DataBind。
它可以节省您的时间并且不易出错,因为您将通过向导配置设置,而不是在代码隐藏中定义它们。