代码之家  ›  专栏  ›  技术社区  ›  Rippo

使用强类型数据而不是字符串绑定到下拉列表

  •  0
  • Rippo  · 技术社区  · 15 年前

    namespace IMTool.Data
    {
        public partial class AllContracts
        {
            internal class Metadata
            {
                public int ContractId { get; set; }
                [Required]
                public string Name { get; set; }
            }
        }
    }
    

    并给出了以下结论。

    using (var context = new IMToolDataContext())
    {
        ddlContracts.DataValueField = "ContractId";
        ddlContracts.DataTextField = "Name";
        ddlContracts.DataSource = context
            .AllContracts
            .OrderBy(o => o.Name);
        ddlContracts.DataBind();
    }
    

    如何强式键入下拉列表DataValue和DataText字段?基本上,我不想使用字符串,而是使用实体中的列名,我使用的是LinqToSql(PLinqo是一组用于生成数据层的codesmith模板) 有人能帮忙吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Gregoire    15 年前

    创建一个自定义属性来执行此操作

    internal class Metadata
    {
        [MappingColumn (Type="Key")]
        public int ContractId { get; set; }
        [Required]
        [MappingColumn (Type="Name")]
        public string Name { get; set; }
    }
    

    使用此签名创建两个方法

    string GetKeyColumName(Type type) //will perfom a loop on the type properties custom attribute and return the first with the type Key
    
    string GetNameColumnName(Type type)//will perfom a loop on the type properties custom attribute and return the first with the type Name
    

    using (var context = new IMToolDataContext())
    {
        ddlContracts.DataValueField = GetKeyColumnName(typeof(Metadata));
        ddlContracts.DataTextField = GetNameColumnName(typeof(Metadata));
        ddlContracts.DataSource = context
            .AllContracts
            .OrderBy(o => o.Name);
        ddlContracts.DataBind();
    }
    

    编辑: 我提到的column属性是yourcunstom属性,而不是Linq中的属性。好的,我应该叫它MappingColumn,它可以这样声明:

    public class MappingColumnAttribute : System.Attribute 
    {
    
       public string Type {get;set;}
    }