#javascript #jquery #vb.net
#javascript #jquery #vb.net
Вопрос:
Приветствую,
При нажатии кнопки javascript я использую jquery для публикации на URL:
$(".optionClick").click(function () {
var caseOption = $(this).attr('title');
$.post("../tracking/RecordClick.aspx?page=galleryamp;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 ('" amp; trackingIP amp; "', '" amp; trackingItem amp; "', '" amp; trackingDate amp; "')"
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
В локальной разработке это отлично работает для меня, записывая одну запись в базу данных за нажатие кнопки. Однако на сервере каждая публикация генерирует от 1 до 7 записей в базу данных.
Я искал решение в течение нескольких дней безрезультатно. Любая помощь приветствуется!
——————————Обновить———————————
Я попытался упростить процесс, создав VB.Чистая страница только с одной кнопкой:
<%@ 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=galleryamp;type=clickamp;item=XYZ");
});
});
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="Button1" type="button" class="optionClick" value="button" />
</div>
</form>
</body>
</html>
Но проблема сохраняется. Firebug сообщает «Прервано», и страница вызывается несколько раз. Я также пробовал этот javascript:
$(document).ready(function () {
$.ajaxSetup({ url: '../tracking/RecordClick.aspx' });
$(".optionClick").click(function () {
$.ajax({ data: 'page=galleryamp;type=clickamp;item=XYZ' });
});
});
Пробовал это также:
url = "../tracking/RecordClick.aspx?page=galleryamp;type=clickamp;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 работал локально, как и предполагалось, но произошел одинаковый сбой с несколькими записями в базу данных и статусом Firebug «Прервано».
Если я вызываю URL querystring напрямую через браузер, все работает так, как ожидалось.
Может ли это быть связано с какой-то задержкой, поскольку она работает локально? Спасибо за помощь на данный момент!
(Редактировать) Также пробовал использовать полный URL-адрес path в приведенном выше коде — никаких улучшений.
Комментарии:
1. Находится ли это на общедоступном сайте, где мы можем видеть запущенный код?
2. можете ли вы предоставить разметку вашей кнопки, например <тип ввода =»button» class=»optionClick» /> Есть ли у вас другой элемент с таким классом?
3. Да, несколько элементов используют этот же класс, который, как я изначально думал, может быть проблемой. Для тестирования я использовал идентификатор другого элемента и выдал тот же результат. Извините, я не использую реальную кнопку, но действую как кнопка изображения:
4. <a href=»../images/cases/20100506-160528-BCX-002.jpg » class=»optionClick» rel=»lytebox[cases]» title=»BCX-CVX»><img src=»../images/cases/20100506-160538-BCX-002-thumb.jpg » width =»100″ height =»77″ alt =»../images/cases/20100506-160538-BCX-002-thumb.jpg » /></a>
5. Sam — в настоящее время не является общедоступным. Извините.
Ответ №1:
Я нашел решение своей проблемы. Похоже, что более поздние версии .Net предотвращают HTTP POST вызовы, но это разрешено для localhost (вот почему он отлично работал локально). HttpWatch и Firebug оба показали подключение к странице .aspx, но ответа не вернулось. Похоже, что множественные вызовы были попытками повтора для получения ответа.
Моим решением было создать веб-сервис:
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
Это javascript, который я использовал для вызова веб-службы:
$.ajax({
type: "POST",
url: "../tracking/RecordClick.asmx/RecordClick",
data: "page=" DMOriginatingPage "amp;type=" DMType "amp;item=" DMtitle
});
Мне пришлось добавить в систему следующее.веб-раздел web.config:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
Теперь это работает идеально. Я не очень опытен в этой области, поэтому, вероятно, есть лучшее решение для того, что я пытаюсь сделать. Однако, возможно, это поможет кому-то еще — мне потребовалось две недели, чтобы разобраться в этом. 🙂
Ответ №2:
Я бы предложил отследить проблему.
1) Используйте Firefox Firebug, откройте вкладку NET и посмотрите, сколько запросов отправлено.
2) Вставьте свой AJAX URL в адресную строку вашего браузера и посмотрите, что происходит на сервере. Таким образом, вы уверены, что выполнен только один запрос.
Комментарии:
1. Отличная идея. Спасибо. Вариант 1 показывает некоторые прерванные состояния, за которыми следуют 2 или 3 ответа «200 OK». Похоже, моя проблема на стороне javascript, но я не могу определить, что не так. Я попробовал несколько других методов публикации, которые пока не помогли.
2. Спасибо Diodeus. Это привело меня к моему решению. Причиной этой проблемы был какой-то другой Javascript на моей странице, и благодаря Firebug я в конечном итоге смог это исправить. В мой арсенал устранения неполадок добавлен новый инструмент. 🙂 Спасибо!
3. Хорошо, я думал, что у меня это получилось, но я ошибался. Существует та же проблема. Firebug выдает ответ «200 OK» при локальной работе, но как только я попадаю на сервер, я получаю ответ «Прервано». VB. Функциональность Net по-прежнему вызывается и записывается в базу данных, но проблема в том, что она вызывается много раз.
4. Я обновил свой первоначальный пост, чтобы отразить дополнительные усилия по устранению неполадок.
Ответ №3:
Вы пробовали использовать полный путь от корня сайта в вызове post … вместо использования «../»?
Подозрительный код:
$(".optionClick").click(function () {
$.post("../tracking/RecordClick.aspx?page=galleryamp;type=clickamp;item=XYZ");
});
попробуйте удалить «..» и заменить его фактическим путем…Я подозреваю, что это может быть причиной вашей проблемы.
Комментарии:
1. Да, я это сделал. Извините, я хотел упомянуть это в своем обновлении. Я нашел другой пост, который рекомендовал это — был обнадеживающим, но это не помогло.
2. @bham3dman хммм … похоже, проблема на стороне клиента … извините, но на данный момент у меня для вас больше ничего нет.