【问题标题】:ASP.NET Page_Load vs. AJAX page refresh code re-use / Redundancy?ASP.NET Page_Load 与 AJAX 页面刷新代码重用/冗余?
【发布时间】:2014-11-08 17:41:36
【问题描述】:

以下是代码的工作示例,但是我经常发现自己编写 Page_Load 内容只是为了发现自己在通过 ajax 加载后重新编写相同类型的代码在页面上执行相同类型的事情(以避免回发)。 ...

我不禁认为必须有某种更好的(可能是面向对象的)方法来操作和创建我们需要在初始 .NET 页面加载后维护的动态 HTML 方法,而无需刷新整个页面。

在下面的代码示例中,您可以假设 AjaxEnginePage 是一个现有的 .NET 页面,可以适当地解析查询字符串,并且 GetRealTimeFavoritesList() 返回一个适当的对象列表,其中包含需要在 C# 或 JavaScript 中解析的所有信息,来自回到那个时候,我们 GET 代码可重用性,但是我们如何在 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>";
}
}
}     

【问题讨论】:

    标签: javascript c# asp.net ajax entity-framework


    【解决方案1】:

    您根本不需要在服务器端生成此标记。 您已经有一个有效的 ajax 调用,它将获取数据并在 javascript 中生成标记。因此,您应该在页面加载时以及每 10 秒调用一次。即:

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

    这样,当页面加载时,您会立即运行 ajax 调用并填充您的标记,并且您可以从 Page_Load 方法中删除所有重复的代码。

    【讨论】:

    • 谢谢@Keith,但这让我觉得.NET 并没有真正做任何事情。这是做这种事情的常用方法吗?有更好的吗?
    • 如果您希望 .Net 代码完成更多工作,您可以更改 AjaxEnginePage 以生成标记。这样,您的 javascript 需要做的就是一个简单的替换。这也意味着您的所有标记都是从服务器生成和提供的。
    • 但是要回答您的问题“这是做这种事情的常用方法吗?”我个人认为它越来越普遍。越来越多的服务器端代码仅用于将 json 对象传递给客户端,而 javascript 框架负责创建标记。看看 angular.js 和 ember.js。我的观点是,这只会在未来增长。以这种方式构建您的网站还意味着其他客户端(例如手机应用)可以使用它们。
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多