2014-11-08 74 views
0

下面是代碼的工作示例,但是我經常發現自己編寫Page_Load內容只是爲了找到自己重寫相同類型的代碼,在通過ajax加載(避免回發)之後在頁面上做同樣的事情。 ..ASP.NET Page_Load與AJAX頁面刷新代碼重用/冗餘?

我不禁想到,必須有一種更好的(可能是面向對象的)方式來操作和創建我們需要在初始.NET頁面加載後維護而不刷新整個頁面的動態HTML方法。

在下面的代碼示例中,您可以假設AjaxEnginePage是適當分析查詢字符串的現有.NET頁面,並且GetRealTimeFavoritesList()返回具有需要在C#或JavaScript中解析的所有信息的適當對象列表,從那時起,我們獲得了代碼重用性,但是我們如何在C#/ JS中獲得它?

OnlineMemberList.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OnlineMemberList.ascx.cs"  Inherits="OnlineMemberList" %> 
<script src="../AJAJSON/Favorites/Favorites.js"></script> 
<script src="../AJAJSON/Jquery/jquery-1.9.1.js"></script> 
<script src="../AJAJSON/Jquery/jquery-ui-1.10.2.custom.js"></script> 
<script src="../AJAJSON/Jquery/jquery.mousewheel.js"></script> 
<script src="../AJAJSON/Jquery/jquery.jscrollpane.js"></script> 
<script type="text/javascript"> 
     $(document).ready(function() { 
     var settings = { 
          autoReinitialise: true 
         }; 

     $('.scroll-pane').jScrollPane(settings); 

     setInterval(function() { 
     UpdateFavoritesList(); 
     }, 10000); 
    }); 
</script> 

<div id="FavoritesList"> 
    <h3>Favorites</h3> 
    <div id="BottomBorderFavorites"></div> 
    <div id="Favorites" class="scroll-pane"> 
     <br /> 
     <p style="text-align: center;">--- Online ---</p> 
     <div id="OnlineFavoritesUserNames" class="OnlineFavoritesUserNames" runat="server"></div> 
     <div id="FavoritesChatIcon" class="FavoritesChatIcon" runat="server"></div> 
     <div style="clear: both;"></div> 
     <br /> 
     <p style="text-align: center;">--- Offline ---</p> 
    <div id="OfflineFavoritesUserNames" class="OfflineFavoritesUserNames" runat="server"></div> 
</div> 

OnlineMemberList.ascx.cs

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<FavoriteSummary> summaries = favoritesBLL.GetRealTimeFavoritesList(); 
      foreach (FavoriteSummary summary in summaries) 
      { 

       if (summary.isOnline) 
       { 
        OnlineFavoritesUserNames.InnerHtml += "<p>" + summary.you.UserName + "</p>"; 
        if (summary.isAvailableForIM) 
         FavoritesChatIcon.InnerHtml += "<p><img src='../Images/FavoritesList/send-message.png' onclick=\"NewIMWindow('" + summary.you.UserName + "')\"; style='width: 15px; height: 13px;'></img></p>"; 
        else 
         FavoritesChatIcon.InnerHtml += "<p></p>"; 
       } 
       else 
       { 
        OfflineFavoritesUserNames.InnerHtml += "<p>" + summary.you.UserName + "</p>"; 
       } 
      } 
     } 
    } 

Favorites.js

function UpdateFavoritesList() { 

var url = AjaxEnginePage + Category + "&Action=GetRealTimeFavoritesList"; 
$.getJSON(url, null, function (results) { 
    UpdateFavoritesListDisplay(results) 
}); 


function UpdateFavoritesListDisplay(favoritesArray) { 
$(".OnlineFavoritesUserNames")[0].innerHTML = ""; 
$(".FavoritesChatIcon")[0].innerHTML = ""; 
$(".OfflineFavoritesUserNames")[0].innerHTML = ""; 

if (favoritesArray["FavoriteSummary"].length !== 0) { 
    for (var i = 0; i < favoritesArray["FavoriteSummary"].length; ++i) { 
     if (favoritesArray["FavoriteSummary"][i].isOnline == "True") { 
      $(".OnlineFavoritesUserNames")[0].innerHTML += "<p>" + favoritesArray["FavoriteSummary"][i].yourUserName + "</p>"; 
      if (favoritesArray["FavoriteSummary"][i].isAvailableForIM == "True") { 
       $(".FavoritesChatIcon")[0].innerHTML += "<p><img src='../Images/FavoritesList/send-message.png' class='FavoritesChatIcon' onclick=\"NewIMWindow('" + favoritesArray["FavoriteSummary"][i].yourUserName + "')\" /></a></p>"; 
      } 
      else { 
       $(".FavoritesChatIcon")[0].innerHTML += "<p></p>"; 
      } 
     } 
     else { 
      $(".OfflineFavoritesUserNames")[0].innerHTML += "<p>" + favoritesArray["FavoriteSummary"][i].yourUserName + "</p>"; 
     } 
    } 
} 
else { 
    $(".OnlineFavoritesUserNames")[0].innerHTML += "<p>No Favorites</p>"; 
} 
} 
}  

回答

1

根本不需要在服務器端生成此標記。 你已經有一個工作的Ajax調用,將獲取數據並在JavaScript中生成標記。所以你應該在頁面加載時以及每10秒鐘調用一次。即:

UpdateFavoritesList(); 
setInterval(function() { 
    UpdateFavoritesList(); 
    }, 10000); 

這樣在頁面加載時,你立即運行Ajax調用並填充您的標記,你可以從Page_Load方法刪除所有重複的代碼。

+0

謝謝@Keith,但這讓我覺得.NET並沒有真正做什麼。這是做這種事的常用方法嗎?有什麼更好的嗎? – Kulingar 2014-11-12 20:44:20

+0

如果你想讓你的.Net代碼做更多的工作,你可以改變你的AjaxEnginePage來生成標記。這樣,你所有的javascript需要做的只是一個簡單的替換。這也意味着您的所有標記都是從服務器生成並提供的。 – Keith 2014-11-13 17:29:14

+0

但回答你的問題「這是做這種事情的常見方式嗎?」我個人認爲它越來越普遍。越來越多的服務器端代碼僅用於將json對象傳遞給客戶端,JavaScript框架負責創建標記。看看angular.js和ember.js。我的意見是,這隻會在未來增長。以這種方式構建您的網站也意味着其他客戶(如電話應用程序)可以使用它們。 – Keith 2014-11-13 17:31:52