FilterExpression не работает, когда одним из параметров является DateTime
У меня проблема с получением FilterExpression для правильной работы в SqlDataSource. Столбец Date в SqlDatabase, NewsDate, представляет собой DateTime. Текстовый столбец NewsSubject в SqlDataBase является varchar. Вот выражение FilterExpression:
FilterExpression="[NewsSubject] LIKE '%{0}%' AND [NewsDate] = '{1}'"
И параметры управления показаны ниже:
<FilterParameters>
<asp:ControlParameter ControlID="txtNewsSubjectFilter" Name="NewsSubject" Type="String" ConvertEmptyStringToNull="False" />
<asp:ControlParameter ControlID="txtNewsDateFilter" Name="NewsDate" Type="DateTime" PropertyName="Text" />
</FilterParameters>
Ожидаемые результаты - это фильтр для обоих столбцов. Это только фильтрация по дате.
Если я возьму параметр Date ControlParameter и изменим выражение фильтра, чтобы оно использовалось только для NewsSubject, оно отлично работает для NewsSubject (см. Выражение фильтра ниже:)
FilterExpression="[NewsSubject] LIKE '%{0}%'"
У кого-нибудь есть идеи? или это ошибка в Microsoft WebForms?
1 ответ
Мы закончили настройкой FilterExpression в событии OnFiltering в коде этой страницы. Мы удалили часть выражения, которая имела дело с датой и параметром, если текстовое поле фильтра даты не было заполнено (см. FormFiltering ExpressionforDate).
protected void NewsDataSource_OnFiltering(object sender, SqlDataSourceFilteringEventArgs e)
{
var newsDateClause = FormFilteringExpressionforDate(e, "NewsDate");
var firstConnector = FormConjunction(newsDateClause);
var newsSubjectClause = FormFilteringExpressionForString(e, "NewsSubject");
var filterExpression = string.Format("{0}{1}{2}", newsDateClause, firstConnector, newsSubjectClause);
var sqlDataSourceView = sender as SqlDataSourceView;
if (sqlDataSourceView == null)
return;
sqlDataSourceView.FilterExpression = filterExpression;
}
private string FormConjunction(string clause)
{
return clause == string.Empty ? "" : " AND ";
}
private string FormFilteringExpressionForString(SqlDataSourceFilteringEventArgs e, string columnName)
{
return string.Format("{0} LIKE '%{1}%' ", columnName, e.ParameterValues[columnName]);
}
private string FormFilteringExpressionforDate(SqlDataSourceFilteringEventArgs e, string columnName)
{
var columnValue = e.ParameterValues[columnName];
if (columnValue == null)
{
e.ParameterValues.Remove(columnName);
return string.Empty;
}
var convertedColumnValue = ((DateTime)columnValue).ToString("MM/dd/yyyy");
var dateClause = string.Format("{0} = '{1}'", columnName, convertedColumnValue);
return dateClause;
}
Вот код разметки (нам нужно было сохранить FilterExpression, определенный в SqlDataSource, как заполнитель... преобразование не сработало):
<asp:SqlDataSource ID="NewsDataSource" runat="server" OnFiltering="NewsDataSource_OnFiltering"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT * FROM [News]"
FilterExpression="CONVERT([NewsDate], 'System.String') LIKE '%{0}%' AND [NewsSubject] LIKE '%{1}%'"
OldValuesParameterFormatString="original_{0}"
ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" >
<FilterParameters>
<asp:ControlParameter ControlID="txtNewsDateFilter" Name="NewsDate" Type="DateTime" />
<asp:ControlParameter ControlID="txtNewsSubjectFilter" Name="NewsSubject" Type="String" ConvertEmptyStringToNull="False" />
</FilterParameters>