是否有可能在ASP.NET中过度使用ajax

时间:2014-10-06 22:52:00

标签: c# jquery asp.net ajax

这可能听起来像个愚蠢的问题,但最近我遇到了其他人在这里工作的项目。它是一个ASP.NET Web Forms项目,它完全是ajax'ed。但是,它没有使用UpdatePanel或部分回发的传统方式。它使用jQuery .ajax调用完成,这些调用在页面代码后面调用C#WebMethod。 JavaScript中的一个例子可能是这样的:

function SaveThisForm() {
    var params = {};
    params.firstName = $('#txtFirstName').val();
    params.lastName= $('#txtLastName').val();

    var handler = function(msg) {
        if (msg.d != '0') {
            alert('Form Saved!');
            // Do something else
        } else {
            alert('Something is wrong!');
            // Do Something
        }
    };

    doAjaxCallWithParams("MyPage.aspx/SaveForm", JSON.stringify(params), handler);
}

MyPage.aspx.cs可能如下所示:

[WebMethod]
public static string SaveForm(string firstName, string lastName)
{
    var dbAccess = new Customer();
    Customer.FirstName = firstName;
    Customer.LastName = lastName;
    Customer.Save();

    return Customer.CustomerId.ToString();
}

它几乎与检索数据,删除数据和更新数据有关。这可能不是太糟糕,但页面上的一些下降将根据拉起来的客户改变数据。为此,他有一个C#WebMethod函数,它从数据库加载数据并从WebMethod呈现下拉列表并使用jQuery(类似$('#myCityDiv').html(msg.d))将下拉列表放在HTML页面中。

我想我的问题是,这是一个好习惯吗?或者使用UpdatePanel和部分回发更好吗?

1 个答案:

答案 0 :(得分:0)

答案总是: It Depends

我从一个webforms项目开始,最终开发了6年多。虽然那仍然处于维护模式,但我在另一个项目中被介绍给了MVC。不同的是白天和黑夜。 MVC更像是原始的Web编程模式 - 在您需要时发布您需要的内容。

您需要记住的关键因素是性能。使用该webforms应用程序,我的UpdatePanel将回发某个部分,但页面的所有ViewState都必须发布到服务器,然后处理所有PostBack和事件逻辑,并且所有新的ViewState只需将已更改的html重新下载到客户端。对于具有大量控件且仅有10行的简单网格视图,在 EACH 方向上存在超过600k的数据。请记住,webforms可以处理单个<form>元素。

MVC倾向于推卸ViewState并使用几个不同的视图和<form>元素。如果您需要分页您的Widget Grid,您可以将新页面索引发布到'PageWidgetGrid'操作,该操作将返回新网格页面的html。如果我从第1页移到第2页,那么发布的值将是1个字节(在这种情况下,2被视为字符串)。如果没有ViewState障碍,我将上传1个字节,可能下载2 KB。

但是,我同意WebMethod方法与其他页面逻辑混合时非常麻烦,特别是当某些开发人员可能不理解SessionState和其他非静态/共享代码时该页面在WebMethod中不可用。在我看来,如果开发正在进行中,您可能最好开始将项目转换为webforms和MVC的组合。 Webforms和ViewState不适合过于复杂的前端,而MVC倾向于强调对前端的精细开发人员控制。脱离webforms将使您更容易与问题评论中的其他建议框架集成 - 如Knockout,KendoUI等。

如果您使用webforms,您将不得不采用MVC不必做的一些变通方法。示例适用于KnockOut.js:

<!-- doesn't work -->
<asp:CheckBox ID="chkChangeVisibility" runat="server" 
      data-bind="checked: isRowVisible" />

<!-- renders as: -->
<span data-bind="checked: isRowVisible">
    <input id="chkChangeVisibility" type="checkbox" name="chkChangeVisibility" />
</span>

您需要设置webforms在代码隐藏中无法识别的这些属性:

protected void Page_Load(object sender, EventArgs e)
{
    chkChangeVisibility.InputAttributes["data-bind"] = "checked: isRowVisible";
}

来自http://www.codeproject.com/Articles/153735/Using-KnockoutJS-in-your-ASP-NET-applications

*我对前端MVC库的东西并不是很熟悉(例如,Knockout--我一直在后端使用ASP.NET MVC并提供视图,而不是很多单页面的应用程序体验),所以我不知道这个特定的代码示例是否相关。我知道用webforms做UI的东西并不好玩。