Используйте строго типизированные данные, а не строку для привязки к выпадающему списку
Учитывая следующий класс....
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 ответ
Решение
Создайте пользовательский атрибут для этого
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();
}
РЕДАКТИРОВАТЬ: Атрибут столбца, который я имею в виду, является атрибутом yourcunstom, а не атрибутом Linq. Хорошо, я должен был назвать его MappingColumn, его можно объявить так:
public class MappingColumnAttribute : System.Attribute
{
public string Type {get;set;}
}