将参数传递给通用处理程序

时间:2015-05-27 12:23:15

标签: c# asp.net generics generic-handler

是的,所以我通过Scheme Code从数据库中提取信息,并将其显示在webform上,可以在其中修改或创建新记录。 为了获得图像,我创建了一个通用处理程序作为一种虚拟地址。

我在将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 个答案:

答案 0 :(得分:0)

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 + "'";
    }

请注意,出于很多原因,您应该确保使用parameterized queries

另一个选项,如果适用,它会通过HttpHandler传递值。一种方法是使用URL参数。

string schemeCode = Request.Querystring["schemeCode"];

然后像这样传递:

http://someurl/handler.ashx?schemeCode=123

如果您现在不使用参数化查询,则以上是SQL漏洞。