Почему пустое значение в текстовом поле не работает в asp. net ControlParameter? - PullRequest
0 голосов
/ 07 января 2020

У меня есть страница, где есть текстовое поле, в котором пользователь может ввести поисковое значение, и запрос, который затем встраивает его в оператор LIKE.

Оставляя кучу сложности, это по сути this:

<div>
    <asp:TextBox id="txtKey" runat="server" Width="300px" placeholder="Name" />
    <asp:Button ID="btnSearch" Text="Search" runat="server" />
</div>
<div>
    <asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" 
            DataSourceID="ds1">
        <Columns>
            <asp:TemplateField>
                    <ItemTemplate>
                        <%# Eval("name") %>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>
</div>

<asp:SqlDataSource ID="ds1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
    selectcommand="select a.id, a.name
from mytable a
where a.name like '%'+@search+'%'
order by a.name">
    <SelectParameters>
        <asp:ControlParameter Name="search" ControlID="txtKey" PropertyName="text" DbType="String" DefaultValue="%" />
    </SelectParameters>
</asp:SqlDataSource>

Если я не включу DefaultValue в параметр или не установлю для него пустую строку, то, если текстовое поле пустое, это возвращает ноль записей. Но если я добавлю значение по умолчанию «%», то он вернет все записи в таблице, чего я и ожидаю. Если я введу значение в текстовое поле, то оно возвращает записи, которые содержат это значение в любом месте поля имени, как я и ожидал.

Почему мне нужно указать DefaultValue = "%"? Если значение в текстовом поле пустое, я должен искать по имени, например «%%», которое должно соответствовать всем записям. Я попробовал это, просто запустив его как отдельный запрос, и он прекрасно работает.

Если я ничего не набираю в текстовом поле, значение должно быть пустой строкой. Вот что я получу, если получу значение в коде. Я подумал, что на самом деле это может быть null, поэтому я попытался изменить where на «where @search равно нулю или на имя, подобное«% »+@search+ '%'», и это тоже не сработало.

Так что ладно, установка DefaultValue = "%" работает. Но я не понимаю почему. И «Это работает, но я не знаю почему» только немного лучше, чем «Это не работает, и я не знаю почему». : -0

...