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