这可能听起来像个愚蠢的问题,但最近我遇到了其他人在这里工作的项目。它是一个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和部分回发更好吗?
答案 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的东西并不好玩。