下面是代碼的工作示例,但是我經常發現自己編寫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>";
}
}
}
謝謝@Keith,但這讓我覺得.NET並沒有真正做什麼。這是做這種事的常用方法嗎?有什麼更好的嗎? – Kulingar 2014-11-12 20:44:20
如果你想讓你的.Net代碼做更多的工作,你可以改變你的AjaxEnginePage來生成標記。這樣,你所有的javascript需要做的只是一個簡單的替換。這也意味着您的所有標記都是從服務器生成並提供的。 – Keith 2014-11-13 17:29:14
但回答你的問題「這是做這種事情的常見方式嗎?」我個人認爲它越來越普遍。越來越多的服務器端代碼僅用於將json對象傳遞給客戶端,JavaScript框架負責創建標記。看看angular.js和ember.js。我的意見是,這隻會在未來增長。以這種方式構建您的網站也意味着其他客戶(如電話應用程序)可以使用它們。 – Keith 2014-11-13 17:31:52