Передача параметра в универсальный обработчик

Итак, я вытаскиваю информацию из базы данных с помощью кода схемы и отображаю ее в веб-форме, где ее можно изменить или создать новые записи. чтобы получить изображение, я создал универсальный обработчик как своего рода виртуальный адрес.

У меня проблемы с прохождением 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.

Другие вопросы по тегам