#c# #asp.net
#c# #asp.net
Вопрос:
Как я могу получить значение сеанса для веб — метода. Я пробовал, но это дает мне ссылку на объект, не установленную как экземпляр object . Любой орган знает об этой проблеме .я хочу получить значение сеанса первого метода в моем втором методе . как я могу это сделать. я получаю значение из моей ajax-функции на мою страницу asmx в методе getid . но я хочу, чтобы оно было в моем втором методе в качестве параметра, чтобы я мог выполнять процесс поиска
The full code is here
**javascript code**
<script type="text/javascript">
$(document).ready(function () {
$('#btn').on('click', function () {
$.ajax({
url: 'EmployeeWebService.asmx/GetEmployees',
data: { id: '2'}, //this is id i want to get
dataType: "json",
method: 'post',
success: function (data) {
},
error: function (err) {
alert(err);
}
});
});
});
</script>
<script type="text/javascript">
$(document).ready(function () {
$('#btn').on('click', function () {
$('#datatables').DataTable({
columns: [
{ 'data': 'Id' },
{ 'data': 'FirstName' },
{ 'data': 'LastName' },
{ 'data': 'Gender' },
{ 'data': 'JobTitle' },
{
data: "TotalQuestions", render: function
(data, type, row) {
return '<button type="button" data-id=" '
row.Gender ' " class="get_tsk" style="background-
color:steelblue;color:white;border:none;">view</button> '
}
},
],
bServerSide: true,
sAjaxSource: 'EmployeeWebService.asmx/GetEmployees',
sServerMethod:'post'
});
});
});
</script>
**first Method**
Первый способ
идентификатор имени строки;
[WebMethod(EnableSession = true)]
public void GetId(string id)
{
Session["nameofid"] = id;
}
**Second Method**
public void GetEmployees(string id,int iDisplayLength,int
iDisplayStart,int
iSortCol_0,string sSortDir_0,string sSearch)
{
int displayLength = iDisplayLength;
int displayStart = iDisplayStart;
int sortCol = iSortCol_0;
string sortDir = sSortDir_0;
string search = sSearch;
int filteredRows = 0;
string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
//
List<Employee> listEmployee = new List<Employee>();
using (SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("spGetEmployees", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Id", SqlDbType.NVarChar, 50).Value =id;
SqlParameter paramDisplayLength = new SqlParameter()
{
ParameterName = "@DisplayLength",
Value = displayLength
};
cmd.Parameters.Add(paramDisplayLength);
SqlParameter paramDisplayStart = new SqlParameter()
{
ParameterName = "@DisplayStart",
Value = displayStart
};
cmd.Parameters.Add(paramDisplayStart);
SqlParameter paramSortCol = new SqlParameter()
{
ParameterName = "@SortCol",
Value = sortCol
};
cmd.Parameters.Add(paramSortCol);
SqlParameter paramSortDir = new SqlParameter()
{
ParameterName = "@SortDir",
Value = sortDir
};
cmd.Parameters.Add(paramSortDir);
SqlParameter paramSearchString = new SqlParameter()
{
ParameterName = "@Search",
Value = string.IsNullOrEmpty(search) ? null : search
};
cmd.Parameters.Add(paramSearchString);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
filteredRows = Convert.ToInt32(rdr["TotalCount"]);
Employee employee = new Employee();
employee.Id = Convert.ToInt32(rdr["Id"]);
employee.FirstName = rdr["FirstName"].ToString();
employee.LastName = rdr["LastName"].ToString();
employee.Gender = rdr["Gender"].ToString();
employee.JobTitle = rdr["JobTitle"].ToString();
listEmployee.Add(employee);
}
}
var result = new
{
iTotalRecords = GetEmployeeTotalCount(),
iTotalDisplayRecords = filteredRows,
aaData = listEmployee
};
JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(result));
}
private int GetEmployeeTotalCount()
{
int totalEmployees = 0;
string cs =
ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("Select count(*) from
tblEmployees", con);
con.Open();
totalEmployees = (int)cmd.ExecuteScalar();
}
return totalEmployees;
}
}
Ответ №1:
-
Добавьте файл конфигурации маршрута ниже строки :
маршруты.IgnoreRoute(«{x}», new { x = @»..asmx(/.*)?» });
-
Добавить файл веб-сервиса :
[WebMethod(EnableSession = true)] [ScriptMethod] public string HelloWorld() { if (HttpContext.Current.Session["SessionDetail"] != null) { string _SessionData = Convert.ToString(HttpContext.Current.Session["SessionDetail"]); } return "Hello World"; }
-
Назначить значение сеанса :
public ActionResult Index() { Session["SessionDetail"] = "Value for Session"; return View(); }
Комментарии:
1. Поделитесь своим полным кодом, чтобы я мог проверить и вернуться к вам.
2. Проверьте мой другой ответ на сообщение
Ответ №2:
Ну, во-первых, вы используете это:
Session["nameofid"] = id;
и затем это:
HttpContext.Current.Session["nameofid"].ToString();
Следующий вопрос заключается в том, как вы вызываете эти методы? Если вы используете, скажем, jQuery.ajax?
Помните, что это асинхронные вызовы. Если вы вызываете set, а затем в той же заглушке кода вызываете 2-ю процедуру, она часто завершается неудачей, поскольку такие вызовы являются асинхронными.
Вы могли бы рассмотреть возможность использования async = false в вызовах ajax, но браузеры (и jQuery) теперь предупреждают, что неасинхронные вызовы не будут разрешены или поддерживаться.
Что это значит? Будьте осторожны, и если вы выполняете вызов веб-метода для УСТАНОВКИ значения, то вам нужно разделить следующий код на отдельную процедуру.
раньше мы делали:
function ShowPdf(pID) {
// set/save the id
$.ajax({
type: "POST",
async: false,
url: 'ProjectUpload.aspx/SetChoice',
data: '{strSess:"ProofID", strValue:' pID '}',
contentType: "application/json",
datatype: "json"
});
// MORE code here - and MAYBE some code that calls or MIGHT
// use the value based on the ABOVE web method call
// but we CAN'T use async: false anymore!
// so we CAN NOT write code folling here that needs or
// assumes the above call is finished - this code does not
// wait.
Итак, приведенный выше код становится таким:
function ShowPdf(pID) {
// set/save the id
$.ajax({
type: "POST",
success: ShowPdf2, <- AFTER code now is moved to this rouine
url: 'ProjectUpload.aspx/SetChoice',
data: '{strSess:"ProofID", strValue:' pID '}',
contentType: "application/json",
datatype: "json"
});
}
function ShowPdf2() {
// split out due to we have to wait async
// for web call to complete. This code ONLY runs WHEN
// the above web call is 100% done. Even if web server is slow today!
// MUST set session() ProofID before calling this routine
// show a dialog in this page pdfdiv
var mydiv = $('#pdfdiv');
mydiv.dialog({
autoOpen: false, modal: true, title: 'Proofing: ', width: '100%',
position: {
my: "center top",
at: "center top 80"
},close: myempty,
dialogClass: 'dialog-no-close'
});
mydiv.load('../PDF1.aspx');
// Open the dialog
mydiv.dialog('open');
// }
}
Итак, приведенный выше код не выполнялся, поскольку следующий веб-вызов начинался до того, как выполнялся вызов session() set ajax.
Установка async: false работала хорошо, но при отладке браузера мы увидели предупреждения о том, что async: false скоро не будет поддерживаться в jQuery (или веб-браузерах). Итак, вы подключаете процедуру для запуска при выполнении асинхронного вызова и переносите следующий код в эту процедуру, таким образом, следующий код был удален и вызван jQuery (success: event).
Итак, неясно, как / когда / где ваш код вызывает первый веб-метод, но если последует какой-либо вызов кода для проверки / просмотра / захвата / получения / просмотра значения session(), которое будет возвращено из 2-го веб-метода? Вам приходится иметь дело с проблемой асинхронности.
и в зависимости от вашего импорта (с использованием для пользователей c #), тогда, если вам нужно включить пространство имен перед использованием session() в веб-методе.
Я считаю, что должен использовать это:
HttpContext.Current.Session(strSess) = strValue
Итак, я бы использовал одну и ту же ссылку на пространство имен в обоих ваших веб-методах — совсем НЕ понятно, почему вы не указали пространство имен в одной заглушке кода, но поместили его в другую.
Как уже отмечалось, также неясно, как ваш js тестирует / получает значение session(), но, как уже отмечалось, первый веб-вызов для установки session() НЕ будет ждать, и иногда вы обнаруживаете, что при вызове 2-й процедуры для получения session() первая процедура, возможно, еще не завершена (поскольку вызовы асинхронны).
Ответ №3:
Комментарии:
1. Пожалуйста, поделитесь своим кодом в виде текста, а не изображения. Это улучшило бы ваш ответ.
2. Можете ли вы проверить мой ответ
3. я использую функции jquery ajax !.