我正在尝试找到一种最有效的模式,用于将ASP.Net表单中的控件绑定到包含两个枚举作为整数值的数据库表。例如,如果我在代码中定义了这些枚举:
[Flags]
public enum VisibleTo
{
None = 0,
Customers = 1,
Employees = 2,
Managers = 4
}
public enum LinkType
{
AdorableCatVideo = 0,
Selfie = 1,
FakeNews = 2,
Pornography = 3
}
然后我的数据库表中的一行可能如下所示:
基于此,我希望能够像使用带有SQLDataSource的DetailsView一样使用控件来显示一个网格,显示:
Link Text: Kitten Playing With Yarn
Link URL: http://www.kittens.com/yarn134323.html
Link Type: AdorableKittenVideo (preferably with spaces)
Visible to Customers: [check]
Visible to Employees: [check]
Visible to Managers: [check]
我已经研究了一些控件类型,但没有找到任何可以轻松完成的内容,也没有在Google上找到任何建议。我能想到的最好的方法是在Page_Load方法中查询数据库,使用辅助方法将Link Type int转换为人类可读的字符串,并将VisibleTo标志分解为三个布尔值,并将所有这些加载到我可以绑定一个单独的DataTable,然后在更新或插入之前再做一些转换。
有人能想出更优雅的方式来实现这一目标吗?我在想使用IValueConverter在WPF和XAML中做这种类型的事情是多么容易,但我对ASP.Net并不熟悉。提前谢谢!
答案 0 :(得分:2)
您可以将数据库中的值直接转换为Enum并获取它的字符串值。
<asp:TemplateField HeaderText="Link Type">
<ItemTemplate>
<%# (LinkType)Convert.ToInt32(Eval("LinkType")) %>
</ItemTemplate>
</asp:TemplateField>
答案 1 :(得分:1)
我的工作是:
[Flags]
public enum VisibleTo
{
[Description("None")]
None = 0,
[Description("Customers")]
Customers = 1,
[Description("Employees")]
Employees = 2,
[Description("Managers")]
Managers = 4
}
然后我有了这个
public static string GetEnumDescription(Enum en)
{
var type = en.GetType();
var memInfo = type.GetMember(en.ToString());
if (memInfo.Length > 0)
{
var attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs.Length > 0)
{
return ((DescriptionAttribute)attrs[0]).Description;
}
}
return en.ToString();
}
那么你可以做到
GetEnumDescription((VisibleTo)myIntValue);
如果您想浏览列表,可以执行以下操作:
var visibleCheck = (VisibleTo)intFromDb;
foreach (var visibleItem in new[] { VisibleTo.Customers, VisibleTo.Employees, VisibleTo.Managers })
{
if(visibleCheck.HasFlag(visibleItem)
{
Console.WriteLine($"{GetEnumDescription(visibleItem)}: CHECKED");
}
}