1

目前我有以下在 ButtonClick 上运行的代码:

Page.ClientScript.RegisterStartupScript(this.GetType(), "OpenWindow", 
"window.open('" + DocumentData.Tables[0].Rows[0]["WebAddress"].ToString() 
                + "','_blank');", true);

它打开带有来自数据库的给定链接的弹出窗口(通常是文档或图像或视频的链接)。但是我需要稍微修改一下代码,我不知道应该使用哪些方法:

1)我需要检查 url 是否真的存在(如果 URL 是响应式的),如果不是,则不打开弹出窗口,但显示一些消息。这里不知道怎么检查Url是否存在?例如,如果 url 类似于 www.thesitedoesntexists.com,则不要加载弹出窗口。

2) 如果 url 的格式为 www.yahoo.com 而不是http://www.yahoo.comhttps://someurl.com,则上述内容不起作用。

如果我的 Web 应用程序www.myapplication.com在上述场景中,系统会打开 urlwww.myapplication.com/www.yahoo.com而不是www.yahoo.com. 如何处理?它可能与问题#1有关。这是主要问题。

4

1 回答 1

2

以下代码(未经测试)应完成这些任务:

  1. 将验证 url 是否已定义
  2. 将确保它具有 http:// 或 https://
  3. 将通过 HttpRequest 验证 URL 是否存在
  4. 将显示加载了 URL 的弹出窗口,或者如果 URL 未定义或不存在,则会显示警告警报。

按钮单击处理程序代码:

string url = DocumentData.Tables[0].Rows[0]["WebAddress"].ToString();
string script;

if (!string.IsNullOrEmpty(url))
{
    // prepend http to url if it isn't there.
    if(!url.ToLower().StartsWith("http://") || !url.ToLower().StartsWith("https://"))
    {
        url = "http://" + url;
    }

    // verify URL exists:
    if (UrlExists(url))
    {
        script = "window.open('" + url  + "','_blank');";   
    }
    else
    {
        script = "alert('URL does not exist')";
    }
}
else
{
    script = "alert('No URL specified!')";
}

Page.ClientScript.RegisterStartupScript(this.GetType(), "WindowScript", script, true);

并在您的类中定义以下 URL 检查方法:

public static bool UrlExists(string url)
{
   try
   {
      var request = WebRequest.Create(url) as HttpWebRequest;
      if (request == null) return false;
      request.Method = "HEAD";
      using (var response = (HttpWebResponse)request.GetResponse())
      {
         return response.StatusCode == HttpStatusCode.OK;
      }
   }
   catch (UriFormatException)
   {
      //Invalid Url
      return false;
   }
   catch (WebException)
   {
      //Unable to access url
      return false;
   }
}

我将 UrlExists 方法完全归功于: http ://paigecsharp.blogspot.ca/2011/01/verify-url-exists.html

于 2012-10-18T14:46:13.113 回答