Как очистить строку запроса при использовании с элементом управления повторителем с привязкой к данным?

Учитывая следующий URL-адрес:

domain.com/page.aspx?id=123

Как я могу очистить это значение строки запроса, когда оно используется в элементе управления с привязкой к данным, таком как повторители SqlDataSource?

<asp:SqlDataSource ID="projectDataSource" runat="server" 
    ConnectionString="MyConnectionStrings" 
    SelectCommand="select foo from bar">
    <SelectParameters>
        <asp:QueryStringParameter 
            DefaultValue="0" 
            Name="idfromqs" 
            QueryStringField="id" 
            Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

Такой, чтобы ?id=asdf не выдавало ошибку?

На эти похожие вопросы есть хорошие ответы, но ни один из них не соответствует моей проблеме.

Примечание. Это внутреннее приложение, которое ограничено небольшим блоком локального IP-адреса. Я меньше беспокоюсь о вредоносных SQL-инъекциях и больше о том, как не допустить появления у менее опытных пользователей неприятных сообщений об ошибках.


person Michael Jasper    schedule 09.08.2011    source источник


Ответы (2)


Вы можете использовать событие Selecting для SQLDataSource, где вы можете проверить значение запроса. Это событие срабатывает перед вызовом метода Select.

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    SqlDataSource1.SelectParameters.Clear(); //Clear existing parameters
    // based on your check, you can pass the default value
    SqlDataSource1.SelectParameters["idfromqs"].DefaultValue = "Set Value here";

}
person Muhammad Akhtar    schedule 09.08.2011
comment
Итак, если я правильно понимаю: у sqldatasource есть событие, которое запускается ДО того, как запрос будет выполнен в базе данных, и в этом случае я могу проверить правильность значения или нет, прежде чем продолжить? - person Michael Jasper; 09.08.2011

Просто снимите тип. Строка запроса уже является строкой, если только вы не преобразуете ее явно во что-то другое (например, int32). Если есть какая-то причина преобразовать его в int32, вы можете сделать это позже в коде, к которому проще применить логику.

<asp:QueryStringParameter 
   DefaultValue="0" 
   Name="idfromqs" 
   QueryStringField="id" />
person Chains    schedule 09.08.2011
comment
Если бы ID был int, и вы сравнили его со строкой (WHERE id = 'asdf'), да, вы просто ничего не получили бы — и никакой ошибки. Пока вы используете параметры, проблем с инъекциями также не возникает. Конечно, стоит изучить, как переменная id в строке запроса получила нечисловое значение. - person Chains; 09.08.2011
comment
Хм... Это не сработало, как я надеялся: удаление типа из параметра просто немного сместило ошибку. Вместо того, чтобы просто ничего не возвращать и иметь пустой контроль, я получил ошибку преобразования при преобразовании значения nvarchar 'asdf' в тип данных int Error из базы данных. - person Michael Jasper; 09.08.2011
comment
Это похоже на разговор sql-сервера... Что вы делаете с этой переменной? - person Chains; 09.08.2011