【问题标题】:Creating an embedded image button in ASP.net?在 ASP.net 中创建嵌入式图像按钮?
【发布时间】:2015-09-12 17:28:45
【问题描述】:

我需要在 ASP.net 中创建一个可以嵌入到另一个网页中的按钮。

基本上,该按钮将在页面加载时查询数据库服务器端,然后根据查询的返回更改其图像。

有人知道最好的方法吗?如您所知,我不是 ASP.net 的专家。最好用 C# 编写。

【问题讨论】:

  • 不太确定从哪里开始。我只是想弄清楚如何制作一个只有一个按钮的简单视图。我可以肯定地进行编码......但我不能在我的生活中得到一个模板,它只是一个按钮,所以我可以点击它并编写数据库连接服务器端+所有其他东西。跨度>

标签: c# sql asp.net database imagebutton


【解决方案1】:

在这种情况下,我建议使用IHttpHandler 而不是通用的WebForm。 https://msdn.microsoft.com/en-us/library/system.web.ihttphandler(v=vs.110).aspx

处理程序更适合此请求,因为它能够快速响应,并且专为处理不一定基于 HTML 的特定请求而构建。这可以很简单地连接以接受请求、查询数据库并生成您选择的图像。现在您还没有提供太多关于图像来源的信息,但让我们看一个简单的请求。

要在 Web 表单 Web 应用程序中开始,请选择一个新的 GenericHandler,我们将其命名为 DynamicImage.ashx。这将构建我们的初始模板,如下所示。

public class DynamicImage : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

此模板提供了处理我们请求的基础知识。当请求到达时,WebServer 将执行ProcessRequest() 方法,传入HttpContext 作为参数。从这里我们可以使用它来传递我们的响应。

出于参数考虑,假设我们正在根据QueryString 参数username 查询图像,该参数代表我们数据库中的用户。我在您的步骤中包含了一些基本代码来实现这一点。 (代码注释)

public void ProcessRequest(HttpContext context)
{
    //get our username from the query string
    var username = context.Request.QueryString["username"];

    //clear the response and set the content type headers
    context.Response.Clear();
    context.Response.ContentType = "image/png";

    //if the username is empty then end the response with a 401 not found status code
    if (string.IsNullOrWhiteSpace(username))
    {
        context.Response.StatusCode = 401;
        context.Response.End();
        return;
    }

    //do a db query to validate the user. If not valid do a 401 not found
    bool isValidUser = new UserManager().IsValidUser(username);
    if (!isValidUser)
    {
        context.Response.StatusCode = 401;
        context.Response.End();
        return;
    }

    //get the user image file path from a server directory. If not found end with 401 not found
    string filePath = context.Server.MapPath(string.Format("~/App_Data/userimages/{0}.png", username));
    if (!System.IO.File.Exists(filePath))
    {
        context.Response.StatusCode = 401;
        context.Response.End();
        return;
    }

    //finish the response by transmitting the file
    context.Response.StatusCode = 200;
    context.Response.TransmitFile(filePath);
    context.Response.Flush();
    context.Response.End();
}

要调用此处理程序,您只需将图像的src 设置为类似于/DynamicImage.ashx?username=johndoe 的路径。

现在您的要求可能略有不同。例如,您可能从数据库中检索图像为byte[],因此您可能希望使用context.Response.BinaryWrite() 方法而不是使用context.Response.TransmitFile() 方法。此方法传输byte[] 作为响应流。

最后,我建议您参考(我的)另一篇文章,该文章从客户端的角度讨论缓存这些图像。如果您的按钮将非常频繁地生成,这将非常有用。 Leverage browser caching in IIS (google pagespeed issue)

【讨论】:

  • 我相信这个解决方案会奏效。本质上,它查询的状态是可用性的“是”或“否”状态。如果是,则显示一张图像,如果不是,则显示另一张图像。
【解决方案2】:

它可以很简单

<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/arrow-down.gif" OnClick="ImageButton1_Click" />

和后面的代码:

protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
    // do some DB processing here
    ImageButton1.ImageUrl = "~/arrow-up.gif";
}

如果我明白你在问什么。

将它放在页面加载下看起来像这样:

private void Page_Load()
{
    if(!Page.IsPostBack)
    {
        // perform db processing here
        ImageButton.ImageUrl = "~/arrow-up.gif";
    }
}

就是所有需要的。设置 ImageUrl 行可以放在任何你需要的地方。

【讨论】:

  • 我需要在页面加载时进行数据库处理...以更改按钮图像。
  • @willxj:只需将点击事件更改为页面加载事件即可。也将其包裹在!IsPostBack
  • naveen 是对的。把这条线放在你需要的地方很简单。我已经相应地更新了答案。
猜你喜欢
  • 2012-08-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多