多次将Javascript发布到VB.Net页面
您好 单击javascript按钮后,我将使用jquery发布到url:多次将Javascript发布到VB.Net页面,javascript,jquery,vb.net,Javascript,Jquery,Vb.net,您好 单击javascript按钮后,我将使用jquery发布到url: $(".optionClick").click(function () { var caseOption = $(this).attr('title'); $.post("../tracking/RecordClick.aspx?page=gallery&item=" + caseOption); }); 在调用的页面上,我使用以下vb.net代码检索querystring变量并将其写入数
$(".optionClick").click(function () {
var caseOption = $(this).attr('title');
$.post("../tracking/RecordClick.aspx?page=gallery&item=" + caseOption);
});
在调用的页面上,我使用以下vb.net代码检索querystring变量并将其写入数据库:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Request.QueryString("page") Is Nothing Then
Dim trackingPage As String = Request.QueryString("page")
Dim trackingIP As String = Request.UserHostAddress
Dim trackingItem As String = Request.QueryString("item")
Dim trackingDate As String = Date.Now().ToString("G")
Try
Dim conString As String
conString = ConfigurationManager.ConnectionStrings("SSFDBConnectionString").ConnectionString
Dim sqlCon As New SqlConnection(conString)
Dim cmd As New SqlCommand
Select Case trackingPage
Case "gallery"
cmd.CommandType = CommandType.Text
cmd.CommandText = "INSERT INTO UserTrackGallery VALUES ('" & trackingIP & "', '" & trackingItem & "', '" & trackingDate & "')"
cmd.Connection = sqlCon
If sqlCon.State = ConnectionState.Closed Then
sqlCon.Open()
End If
cmd.ExecuteNonQuery()
If sqlCon.State = ConnectionState.Open Then
sqlCon.Close()
End If
Case "products"
Case "search"
End Select
Catch ex As Exception
End Try
Response.Close()
End If
End Sub
在本地开发中,这非常适合我记录每次按钮点击一次数据库写入。但是,在服务器上,每个post都会生成1到7次数据库写入
我已经找了几天的解决办法,但都没有用。非常感谢您的帮助
------------------------------更新--------------------------------
我试图通过创建一个只包含一个按钮的VB.Net页面来简化此过程:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="javascript.aspx.vb" Inherits="gallery_javascript" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="../Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$.ajaxSetup({ async: false });
$(".optionClick").click(function () {
$.post("../tracking/RecordClick.aspx?page=gallery&type=click&item=XYZ");
});
});
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="Button1" type="button" class="optionClick" value="button" />
</div>
</form>
</body>
</html>
我也试过:
url = "../tracking/RecordClick.aspx?page=gallery&type=click&item=XYZ";
if (window.XMLHttpRequest) { // Non-IE browsers
req = new XMLHttpRequest();
try {
req.open("POST", url, false);
} catch (e) {
alert(e);
}
req.send(null);
} else if (window.ActiveXObject) { // IE
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.open("POST", url, false);
req.send();
}
}
上面的每个javascript块都按预期在本地工作,但以相同的方式失败,出现多个DB写入和Firebug“中止”状态
如果我通过浏览器直接调用url+querystring,一切都会正常工作
这可能与某种延迟有关,因为它在本地工作?
谢谢你迄今为止的帮助
(编辑)还尝试在上面的代码中使用完整路径url-没有改进。我建议跟踪问题 1) 使用Firefox+Firebug,打开NET选项卡,观察发送了多少请求
2) 将AJAX URL粘贴到浏览器的地址栏中,然后查看服务器上发生了什么。通过这种方式,您可以确保只发出一个请求。我建议跟踪问题 1) 使用Firefox+Firebug,打开NET选项卡,观察发送了多少请求
2) 将AJAX URL粘贴到浏览器的地址栏中,然后查看服务器上发生了什么。通过这种方式,您可以确保只发出一个请求。您是否尝试在post调用中使用站点根目录的完整路径…而不是使用“./” 可疑代码:
$(".optionClick").click(function () {
$.post("../tracking/RecordClick.aspx?page=gallery&type=click&item=XYZ");
});
尝试删除“.”并将其替换为实际路径…我怀疑这可能会导致您的问题。您是否尝试在post调用中使用站点根目录的完整路径…而不是使用“./” 可疑代码:
$(".optionClick").click(function () {
$.post("../tracking/RecordClick.aspx?page=gallery&type=click&item=XYZ");
});
尝试删除“.”并将其替换为实际路径…我怀疑这可能会导致您的问题。我找到了解决问题的方法。较新版本的.Net似乎阻止了HTTP POST调用,但localhost允许这样做(这就是为什么它可以在本地完美工作的原因)。HTTPWatch和Firebug都显示了.aspx页面连接,但没有返回响应。似乎多次呼叫都是为了接收响应而进行的重试尝试 我的解决方案是创建一个web服务:
Option Strict On
Imports System.Data.SqlClient
Imports System.Data
Imports System
Imports System.Net
Imports System.Text
Imports System.IO
Imports System.Web.HttpContext
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://mywebsite.com/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class RecordClick
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function RecordClick() As String
Dim trackingPage As String = ""
Dim trackingIP As String = ""
Dim trackingType As String = ""
Dim trackingItem As String = ""
Dim trackingDate As String = ""
With HttpContext.Current
trackingPage = .Request.Params.Item(0)
trackingIP = .Request.UserHostAddress
trackingType = .Request.Params.Item(1)
trackingItem = .Request.Params.Item(2)
trackingDate = Date.Now().ToString("G")
End With
Dim conString As String
conString = ConfigurationManager.ConnectionStrings("SSFDBConnectionString").ConnectionString
Dim sqlCon As New SqlConnection(conString)
Dim cmd As New SqlCommand
cmd.Connection = sqlCon
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "spInsertRecordClick"
cmd.Parameters.Add("@IPAddress", SqlDbType.NVarChar, 50)
cmd.Parameters("@IPAddress").Direction = ParameterDirection.Input
If trackingIP = "" Then
cmd.Parameters("@IPAddress").Value = DBNull.Value
Else
cmd.Parameters("@IPAddress").Value = trackingIP
End If
cmd.Parameters.Add("@CaseOption", SqlDbType.NVarChar, 50)
cmd.Parameters("@CaseOption").Direction = ParameterDirection.Input
If trackingItem = "" Then
cmd.Parameters("@CaseOption").Value = DBNull.Value
Else
cmd.Parameters("@CaseOption").Value = trackingItem
End If
cmd.Parameters.Add("@TimeDate", SqlDbType.DateTime)
cmd.Parameters("@TimeDate").Direction = ParameterDirection.Input
If trackingDate = "" Then
cmd.Parameters("@TimeDate").Value = DBNull.Value
Else
cmd.Parameters("@TimeDate").Value = trackingDate
End If
cmd.Parameters.Add("@ViewType", SqlDbType.NChar, 10)
cmd.Parameters("@ViewType").Direction = ParameterDirection.Input
If trackingType = "" Then
cmd.Parameters("@ViewType").Value = DBNull.Value
Else
cmd.Parameters("@ViewType").Value = trackingType
End If
cmd.Parameters.Add("@Page", SqlDbType.NVarChar, 50)
cmd.Parameters("@Page").Direction = ParameterDirection.Input
If trackingPage = "" Then
cmd.Parameters("@Page").Value = DBNull.Value
Else
cmd.Parameters("@Page").Value = trackingPage
End If
Try
If sqlCon.State = ConnectionState.Closed Then
sqlCon.Open()
End If
cmd.ExecuteNonQuery()
Catch ex As Exception
Finally
If sqlCon.State = ConnectionState.Open Then
sqlCon.Close()
End If
End Try
If sqlCon.State = ConnectionState.Open Then
sqlCon.Close()
End If
Return "Success"
End Function
End Class
$.ajax({
type: "POST",
url: "../tracking/RecordClick.asmx/RecordClick",
data: "page=" + DMOriginatingPage + "&type=" + DMType + "&item=" + DMtitle
});
我必须将以下内容添加到web.config的system.web部分:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
它现在工作得很好。我在这方面不是很有经验,所以可能有更好的解决方案。然而,也许这会帮助其他人——我花了两周时间才弄明白这一点 我找到了解决问题的办法。较新版本的.Net似乎阻止了HTTP POST调用,但localhost允许这样做(这就是为什么它可以在本地完美工作的原因)。HTTPWatch和Firebug都显示了.aspx页面连接,但没有返回响应。似乎多次呼叫都是为了接收响应而进行的重试尝试 我的解决方案是创建一个web服务:
Option Strict On
Imports System.Data.SqlClient
Imports System.Data
Imports System
Imports System.Net
Imports System.Text
Imports System.IO
Imports System.Web.HttpContext
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://mywebsite.com/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class RecordClick
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function RecordClick() As String
Dim trackingPage As String = ""
Dim trackingIP As String = ""
Dim trackingType As String = ""
Dim trackingItem As String = ""
Dim trackingDate As String = ""
With HttpContext.Current
trackingPage = .Request.Params.Item(0)
trackingIP = .Request.UserHostAddress
trackingType = .Request.Params.Item(1)
trackingItem = .Request.Params.Item(2)
trackingDate = Date.Now().ToString("G")
End With
Dim conString As String
conString = ConfigurationManager.ConnectionStrings("SSFDBConnectionString").ConnectionString
Dim sqlCon As New SqlConnection(conString)
Dim cmd As New SqlCommand
cmd.Connection = sqlCon
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "spInsertRecordClick"
cmd.Parameters.Add("@IPAddress", SqlDbType.NVarChar, 50)
cmd.Parameters("@IPAddress").Direction = ParameterDirection.Input
If trackingIP = "" Then
cmd.Parameters("@IPAddress").Value = DBNull.Value
Else
cmd.Parameters("@IPAddress").Value = trackingIP
End If
cmd.Parameters.Add("@CaseOption", SqlDbType.NVarChar, 50)
cmd.Parameters("@CaseOption").Direction = ParameterDirection.Input
If trackingItem = "" Then
cmd.Parameters("@CaseOption").Value = DBNull.Value
Else
cmd.Parameters("@CaseOption").Value = trackingItem
End If
cmd.Parameters.Add("@TimeDate", SqlDbType.DateTime)
cmd.Parameters("@TimeDate").Direction = ParameterDirection.Input
If trackingDate = "" Then
cmd.Parameters("@TimeDate").Value = DBNull.Value
Else
cmd.Parameters("@TimeDate").Value = trackingDate
End If
cmd.Parameters.Add("@ViewType", SqlDbType.NChar, 10)
cmd.Parameters("@ViewType").Direction = ParameterDirection.Input
If trackingType = "" Then
cmd.Parameters("@ViewType").Value = DBNull.Value
Else
cmd.Parameters("@ViewType").Value = trackingType
End If
cmd.Parameters.Add("@Page", SqlDbType.NVarChar, 50)
cmd.Parameters("@Page").Direction = ParameterDirection.Input
If trackingPage = "" Then
cmd.Parameters("@Page").Value = DBNull.Value
Else
cmd.Parameters("@Page").Value = trackingPage
End If
Try
If sqlCon.State = ConnectionState.Closed Then
sqlCon.Open()
End If
cmd.ExecuteNonQuery()
Catch ex As Exception
Finally
If sqlCon.State = ConnectionState.Open Then
sqlCon.Close()
End If
End Try
If sqlCon.State = ConnectionState.Open Then
sqlCon.Close()
End If
Return "Success"
End Function
End Class
$.ajax({
type: "POST",
url: "../tracking/RecordClick.asmx/RecordClick",
data: "page=" + DMOriginatingPage + "&type=" + DMType + "&item=" + DMtitle
});
我必须将以下内容添加到web.config的system.web部分:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
它现在工作得很好。我在这方面不是很有经验,所以可能有更好的解决方案。然而,也许这会帮助其他人——我花了两周时间才弄明白这一点 这是在一个我们可以看到代码运行的公共站点上吗?你能提供按钮的标记吗,就像你有另一个元素与该类一起使用一样?是的,多个元素共享同一个类,我最初认为这可能是问题所在。为了进行测试,我使用了另一个元素的ID并产生了相同的结果。抱歉,没有使用实际的按钮,而是充当图像按钮:Sam-当前未公开。很抱歉。这是在一个公共站点上,我们可以看到代码正在运行吗?您可以提供按钮的标记,就像您有另一个元素与该类一起使用吗?是的,多个元素共享同一个类,我最初认为这可能是问题所在。为了进行测试,我使用了另一个元素的ID并产生了相同的结果。抱歉,没有使用实际的按钮,而是充当图像按钮:Sam-当前未公开。对不起,好主意。谢谢选项1显示一些中止状态,然后是2或3个“200 OK”响应。看起来我的问题出在javascript方面,但我无法确定到底出了什么问题。我已经尝试了其他几种post方法,现在可以使用了。谢谢。这让我找到了解决办法。我页面上的其他一些Javascript导致了这个问题,多亏了Firebug,我最终能够纠正它。我的故障排除库中添加了一个新工具。:)谢谢好吧,我以为我被打败了,但我错了。同样的问题也存在。Firebug在本地工作时显示“200 OK”响应,但一旦在服务器上工作,我就会收到“中止”响应。VB.Net功能仍然会被调用并写入数据库,但问题是调用了很多次。我更新了我的原始帖子,以反映更多的故障排除工作。好主意。谢谢选项1显示一些中止状态,然后是2或3个“200 OK”响应。看起来我的问题出在javascript方面,但我无法确定到底出了什么问题。我已经尝试了其他几种post方法,现在可以使用了。谢谢。这让我找到了解决办法。我页面上的其他一些Javascript导致了这个问题,多亏了Firebug,我最终能够纠正它。我的故障排除库中添加了一个新工具。:)谢谢好吧,我以为我有这个