问题描述
如何获取Web方法的会话值。我已经尝试过,但是它给了我对象引用,而不是设置为object的实例。任何人都知道这个问题。我想在我的第二个方法中获得第一个方法的会话值。 我该怎么做 。我在getid方法中从我的ajax函数到asmx页面获得价值。但我希望它以第二种方法作为参数,以便我可以执行搜索过程
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**
第一种方法 字符串nameofid;
[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;
}
}
解决方法
@fazal-检查下面的屏幕截图,然后按照步骤操作。
我希望这对您有帮助。
,-
在以下行添加路由配置文件:
routes.IgnoreRoute(“ { x}”,新的{x = @“。 .asmx(/.*)?”});
-
添加WebService文件:
[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(); }
好吧,首先,您使用这个:
Session["nameofid"] = id;
然后是这个
HttpContext.Current.Session["nameofid"].ToString();
下一个问题是如何调用这些方法?如果您使用jQuery.ajax?
请记住它们是异步调用。如果您调用set,然后在同一代码存根中调用第二个例程,则该例程通常会失败,因为此类调用是异步的。
您“可以”考虑在ajax调用中使用async = false,但是浏览器(和jQuery)现在警告不允许或不支持非异步调用。
这是什么意思?请注意,如果要通过Web方法调用SET值,则需要将随后的代码拆分到单独的例程中。
我们曾经做过:
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',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()设置ajax调用之前,以下网络调用将开始运行。
设置async:false DID可以很好地工作,但是在浏览器调试中,我们看到了警告:jQuery(或Web浏览器)很快将不再支持async:false。因此,您将在异步调用完成后连接一个例程以运行,然后移出该例程的后续代码,这样,随后的代码就被jQuery移出并调用了(成功:事件)。
因此,尚不清楚您的代码如何/何时/何地调用第一个Web方法,但是如果有任何代码调用FOLLOWS来检查/查看/抓取/获取/查看从第二个Web返回的session()值方法?您必须处理异步问题。
并取决于您的导入(用于c#人员),那么如果需要在Web方法中使用session()之前包括名称空间。
我发现我必须使用它:
HttpContext.Current.Session(strSess) = strValue
因此,我将在两个Web方法中使用相同的名称空间引用-完全不清楚为什么您在一个代码存根中保留了名称空间,而在另一个存根中保留了名称空间。
如前所述,还不清楚您的js如何测试/获取session()值,但是如前所述,第一个设置session()的网络调用不会等待,有时您会发现当您调用第二个获取session()的例程,第一个例程可能尚未完成(因为调用是异步的)。