[英]calling a c#.net function from javascript
我正在使用C#.net創建一個應用程序。
我試圖在數據庫中的數據更新后立即更新頁面。
我已將數據庫中的一個值存儲在一個標簽中,並且每次在另一個標簽中存儲相同的值時,我都會調用一個函數,此后,我將兩個標簽進行比較。
該代碼是
我的webpage.aspx.cs是
public partial class _Default : System.Web.UI.Page
{
SqlConnection con = new SqlConnection();
protected void Page_Load(object sender, EventArgs e)
{
con.ConnectionString = ConfigurationManager.ConnectionStrings["cn"].ConnectionString;
if (con.State == System.Data.ConnectionState.Closed)
{
con.Open();
}
SqlDataAdapter adp = new SqlDataAdapter("SELECT name from Master where id= 10"), con);
DataSet ds = new DataSet();
adp.Fill(ds);
Label2.Text = Convert.ToString(ds1);
}
protected String CodeBehind()
{
SqlDataAdapter adp = new SqlDataAdapter("SELECT name from Master where id= 10"), con);
DataSet ds = new DataSet();
adp.Fill(ds);
String ds2 = Convert.ToString(ds1);
return (ds2);
}
protected int compare()
{
string abc = Label2.Text;
string abcd = Label3.Text;
if (abc == abcd)
{
return(0);
}
else
{
return (1);
}
}
}
而我的前端javascript代碼是
<script type="text/JavaScript">
function AutoRefresh() {
document.getElementById('<%= Label3.ClientID %>').innerHTML = '<%= CodeBehind() %>';
var res = '<%= compare() %>'
if ( res == 1) {
alert("same");
setTimeout("location.reload(true);", 60000);
}
else {
alert("different")
abx();
}
}
function abx() {
AutoRefresh();
}
但是有一個問題,當我在后面調用函數代碼時,它正在執行整個后端代碼,因此兩個標簽的值會同時更新。
我只想每次都調用函數背后的代碼,並且只想更新一次label2的值。
有人可以告訴我我該怎么做。
您無法從JavaScript調用C#函數-如果可能,請想象那些懷有惡意的人可以做什么?
您需要在此處使用Ajax,然后從您的Web表單中發布/獲取信息。
您的JavaScript代碼除了重新加載頁面外什么也不做-這意味着將執行整個頁面加載周期,因此為什么要執行所有代碼。 您還將混淆客戶端和服務器端代碼,並誤解ASPX引擎如何呈現其內容。
我為我的Ajax使用了JQuery (您可以不使用JQuery ,但JQuery可以使它更快,更簡單),但是您還需要使Ajax調用可以訪問您的函數。 使用回調來更新標簽:
$.ajax({
url: "/url/to/your/post/page"
}).done(function ( data ) {
// Check validity of "data"
$("#label2").val("Updated!");
});
值得注意的是,您可以做更多的事情。 請參閱我的鏈接獲取$ ajax()文檔。
就“ / url /至/您的/帖子/頁面”而言,由於您使用的是Web表單,因此需要創建一個頁面,以將正確的內容返回給您的Ajax函數。 我稍后會發布更多信息。
您真的需要先弄清JavaScript和C#之間的區別,然后再嘗試執行與定時AJAX回調一樣復雜的事情-在HTML輸出到客戶端之前呈現<%=%>標簽,並且客戶端絕對看不到您的C#類或其方法。
首先,您需要確定您的方法。 這可以通過兩種方式完成。
保持每隔x
秒輪詢服務器一次,以查看該值是否更改。 為此,您可以使用AJAX調用AJAX Web服務或PageMethods 。 在這兩種情況下,您都無法訪問頁面中的控件。 如果要訪問控件,則會觸發整個頁面事件生命周期(這是當前的問題)。
使您的服務器向您的客戶端發送信號,指示值已更改。 這可以通過各種技術來完成。 最好的方法是使用SignalR庫。
使用SignalR將幫助您輕松擴展應用程序。
相應地更新代碼:
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
con.ConnectionString = ConfigurationManager.ConnectionStrings["cn"].ConnectionString;
if (con.State == System.Data.ConnectionState.Closed)
{
con.Open();
}
Label2.Text = CodeBehind();
}
}
protected String CodeBehind()
{
SqlDataAdapter adp = new SqlDataAdapter("SELECT name from Master where id= 10"), con);
DataSet ds = new DataSet();
adp.Fill(ds);
String ds2 = Convert.ToString(ds1);
return (ds2);
}
並從函數AutoRefresh()中刪除此行
setTimeout("location.reload(true);", 60000);
希望能幫助到你 :)
如果要通過使用ASP.NET AJAX來實現此目的,則可以使用UpdatePanel和Timer控件,這是一個教程教程:如何以一定的時間間隔刷新UpdatePanel控件,否則可以使用jQuery Ajax。
嘗試使用Page.IsPostBack屬性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.