Передача параметра в универсальный обработчик
Итак, я вытаскиваю информацию из базы данных с помощью кода схемы и отображаю ее в веб-форме, где ее можно изменить или создать новые записи. чтобы получить изображение, я создал универсальный обработчик как своего рода виртуальный адрес.
У меня проблемы с прохождением dropdownlist.selectedItem.Text
(Именно здесь вы выбираете код Схемы для нужной записи) в качестве параметра в универсальном обработчике. Я могу передать строку напрямую, а затем просто выбрать этот конкретный код Scheme, и все это работает.
Это код команды SQL
public static TemplateData ReturnData(string schemeCode)
{
string sqlInstructionCstmID = "SELECT TOP(1) LetterTemplateCustomisationId, TemplateId, Logo, SchemeCode, Version, Comment FROM LetterTemplateCustomisation WHERE SchemeCode ='" + schemeCode + "'";
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LettersDatabase"].ConnectionString;
SqlConnection connect = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(sqlInstructionCstmID, connect);
command.CommandType = CommandType.Text;
connect.Open();
SqlDataReader dr = command.ExecuteReader();
TemplateData tempData = null;
if (dr.HasRows)
{
dr.Read();
tempData = new TemplateData(dr);
}
dr.Close();
connect.Close();
return tempData;
}
Универсальный обработчик... с пустыми параметрами
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
TemplateData imgData = DataClass.ReturnData();
if (imgData != null)
{
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(imgData.Logo);
context.Response.OutputStream.Write(imgData.Logo, 0, imgData.Logo.Length);
context.Response.Flush();
}
}
и это код позади
protected void btnSearch_Click(object sender, EventArgs e)
{
if (ddSchemeCode.SelectedIndex > 0)
{
// Existing Data to load from database
TemplateData temp = DataClass.ReturnData(ddSchemeCode.SelectedItem.Text);
if (temp != null)
{
txtVersion.Text = temp.Version;
txtComment.Text = temp.Comment;
txtSchemeCode.Text = temp.SchemeCode;
txtTemplateId.Text = temp.TemplateId;
imgLogo.ImageUrl = "ImageHandler.ashx"
}
}
так что это пустой параметр в TemplateData imgData = DataClass.ReturnData();
С этим у меня трудности.
Как обычно, большое спасибо заранее, ребята!
1 ответ
DataClass.ReturnData();
не будет работать, так как не обеспечивает значение для требуемого schemeCode
параметр.
Вам следует либо создать другой метод без этого параметра, либо указать значение по умолчанию, например null
, который пропустит фильтр в операторе SQL.
Например:
public static TemplateData ReturnData(string schemeCode = null)
{
string sqlInstructionCstmID = "SELECT TOP(1) LetterTemplateCustomisationId, TemplateId, Logo, SchemeCode, Version, Comment FROM LetterTemplateCustomisation;
if (!string.IsNullOrEmpty(schemeCode))
{
sqlInstructionCstmID += " WHERE SchemeCode ='" + schemeCode + "'";
}
Обратите внимание, что вы действительно должны использовать параметризованные запросы по многим причинам!
Другой вариант, если это применимо, передает значение через HttpHandler
, Один из способов сделать это - использовать параметр URL.
string schemeCode = Request.Querystring["schemeCode"];
Затем передайте это так:
http://someurl/handler.ashx?schemeCode=123
Если вы не используете параметризованные запросы прямо сейчас, вышеперечисленное является уязвимостью SQL.