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

本文关键字:ajax NET 是否 ASP | 更新日期: 2023-09-27 18:25:48

这听起来可能是一个愚蠢的问题,但最近我在工作中遇到了一个其他人参与的项目。这是一个ASP.NET Web窗体项目,它完全是一个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的和部分回发更好?

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

答案总是:It Depends

我从一个网络表单项目开始,这个项目开发了6年多。当它仍处于维护模式时,我在另一个项目中被介绍到MVC。区别在于白天和黑夜。MVC更像是原始的web编程模式——在需要的时候发布你需要的东西

您需要记住的关键因素是性能。有了这个webforms应用程序,我的UpdatePanel会在某个部分发布,但页面的所有ViewState都必须发布到服务器,然后处理所有PostBack和事件逻辑,所有新的ViewState和更改后的html都必须重新下载到客户端。对于一个有很多控件和只有10行的简单网格视图,EACH方向上有超过600k的数据。请记住,web表单是通过单个<form>元素来工作的。

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

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

如果你一直在使用web表单,你将不得不结合一些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>

您需要在代码后面设置这些Web表单无法识别的属性:

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,只是没有太多的单页应用程序经验),所以我不知道这个特定的代码示例是否相关。我知道用网页表单做用户界面的事情并不好玩。