Используйте строго типизированные данные, а не строку для привязки к выпадающему списку - PullRequest
0 голосов
/ 30 ноября 2009

Учитывая следующий класс ....

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, который представляет собой набор шаблонов для кодирования, чтобы генерировать мой слой данных) Кто-нибудь может помочь?

1 Ответ

2 голосов
/ 30 ноября 2009

Создайте пользовательский атрибут для этого

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

и заполните ваш ddl следующим образом:

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();
}

EDIT: Атрибут столбца, на который я ссылаюсь, является атрибутом yourcunstom, а не атрибутом Linq. Хорошо, я должен был назвать его MappingColumn, его можно объявить так:

public class MappingColumnAttribute : System.Attribute 
{

   public string Type {get;set;}
}
...