LinqDataSource и формат DateTime

Я пытаюсь создать LinqDataSource для привязки к DropDownList в форме ASP.NET. Я хочу отображать элементы только по дате (это одно из полей в базе данных).

По сути, элементы, которые я хочу показать, — это те, которые произойдут в будущем (то есть после DateTime.Now).

Я пробовал следующую разметку:

<asp:DropDownList runat="server" ID="DropDownList1" 
    AppendDataBoundItems="True" DataSourceID="LinqDataSource1"
    DataTextField="TextField" DataValueField="ValueField">
</asp:DropDownList>
<asp:LinqDataSource ID="LinqDataSource1" runat="server" 
    ContextTypeName="DataContext1" TableName="Table" 
    Where="DateField &gt;= @DateField">
    <WhereParameters>
        <asp:Parameter DefaultValue="DateTime.Now" Name="DateField" 
            Type="DateTime" />
    </WhereParameters>
</asp:LinqDataSource>

Я получаю исключение формата, говорящее, что «Строка не была распознана как допустимая дата и время», когда я пытаюсь ее запустить. Тем не менее, даты в моей базе данных, кажется, в порядке, потому что DateTime.Parse отлично работает с ними. DateField имеет тип datetime в SQL.

Что мне здесь не хватает?

Спасибо!


person Hugo Migneron    schedule 27.05.2009    source источник


Ответы (3)


DefaultValue было то, что было не так с кодом, как было предложено другими.

Однако установка DefaultValue на

 "<%# DateTime.Now %>"

как предложил Андомар (что сделало бы разметку примерно такой:

<WhereParameters>
                <asp:Parameter DefaultValue="<%# DateTime.Now %>" Name="DateField" Type="DateTime" />
</WhereParameters>

также не будет работать, потому что выражения DataBinding поддерживаются только для объектов, у которых есть событие DataBinding, а ни Parameter, ни ControlParameter его нет.

Для строки довольно легко создать TextBox или Label и поместить выражение ‹%# %> в значение этого нового поля (подробнее здесь), но это было немного сложнее со значением DateTime, так как сравнение SQL DateTime с .NET DateTime вызвал исключение.

Это можно легко сделать в событии Page_Load, используя

DataContext DataContext1 = new DataContext();

    var c = from a in DataContext1.Field
            where a.DateField >= DateTime.Now
            select a;
    DropDownList.DataSource = c;
    DropDownList.DataBind();
person Hugo Migneron    schedule 28.05.2009

Я подозреваю, что это не работает с DefaultValue.

person leppie    schedule 27.05.2009

Пытаться:

DefaultValue="<%# DateTime.Now %>"
person Andomar    schedule 27.05.2009
comment
Направьте меня в правильном направлении. Однако вы не можете использовать выражение для параметра. Смотрите мой ответ для более подробной информации. - person Hugo Migneron; 28.05.2009