如何决定何时使用Ajax和Javascript进行维护
本文关键字:Ajax Javascript 维护 何时使 何决定 决定 | 更新日期: 2023-09-27 18:19:40
在ASP.Net开发过程中,我经常不确定是否应该使用ajax请求执行一些功能,而不是在客户端上使用JavaScript处理所有功能。我经常想使用Jquery ajax函数来加快开发速度并提高可维护性,即使我可以在不联系服务器的情况下获得相同的结果。
这里有一个例子。在我的MVC视图中,我需要更新一个部分视图来响应按钮点击。这是我的部分视图的简化版本
@foreach (Requestbox.Code.XmlContentField xmlControl in Model.RequestContentControls)
{
if (Model.IsInEditMode)
{
ViewContext.Writer.Write("<div class='editDiv'>
<a href='#' onclick='EditClick()'>Edit</a>
<a href='#' onclick='DeleteClick()'>Delete</a>");
}
switch (xmlControl.ControlType)
{
case "TextBoxField":
<div class="clearfix">
@Html.DevExpress().Label(settings => {
settings.Name = xmlControl.FieldName + "Label";
settings.AssociatedControlName = xmlControl.FieldName + "TextBox";
settings.Text = xmlControl.LabelText;
}).GetHtml()
<div class="input">
@Html.DevExpress().TextBox(settings => {
settings.Name = xmlControl.FieldName + "TextBox";
MvcExtensionHelpers.SetTextBoxSettings(settings);
settings.ControlStyle.CssClass += " full-width";
}).GetHtml()
</div>
</div>
break;
case "Header":
string header = string.Format("<{0}>{1}</{0}>", xmlControl.HeaderType,xmlControl.Value);
@Html.Raw(header)
break;
}
if (Model.IsInEditMode)
{
ViewContext.Writer.Write("</div>");
}
}
当单击Edit按钮时,我需要将我的每个部分包装在一个div中,并在其中添加2个带有onclick函数的锚点元素。我可以通过使用ajax post请求并将Model设置为"IsInEditMode为true"来实现这一点。这是我可以调用的代码,它用新视图替换了当前的部分视图。
function EnableEditClick() {
$.post(rootDir + "Admin/EditClick",null,
function(partialViewResult){
$("#refTable").html(partialViewResult);
});
}
以下是可以处理ajax请求的操作
public ActionResult EditClick()
{
MyModel model = new MyModel();
model.IsInEditMode = true;
return PartialView("CustomRequest", model);
}
这是一种解决方案,另一种是通过使用jquery选择所需的每个元素并直接插入锚元素,在客户端上处理这一切。我还可以将一些代码从视图中删除。所以像这样的东西(还没有测试过这个代码,但我希望你能明白)
function EditClick()
{
var elements = $('.myTable .clearfix')
elemtns.append(' <a href='#' onclick='EditClick()'>Edit</a>
<a href='#' onclick='DeleteClick()'>Delete</a>');
}
我很纠结哪一个在可维护性方面更好,因为使用ajax方式,我不必在JavaScript页面中编写html,我认为在修改代码时它会更清晰、可读。然而,当我可以在客户端上处理所有事务时,我却向服务器发出了一个不必要的请求。
因此,我的问题是,如果可能的话,我是否应该一直在客户端上做所有事情,即使是以可维护性为结果。对我的例子的任何反馈也非常感谢。
我建议您使用AJAX进行操作,这些操作需要在服务器上进行一些后台计算或从服务器检索一些DB数据。对于GUI生成,我会使用JS,因为它非常快速,这要归功于V8。
如果您需要通过在其中嵌入一些服务器数据来生成GUI,并且此页面具有复杂的布局,我会使用服务器端模板引擎。
在您给出的示例中,我建议使用JS方法来控制编辑和删除按钮的可用性。或者可能是两者的结合。
当您进行Ajax调用时,它会创建一个后台请求,该请求会导致一些HTTP流量。除非服务器上需要一些处理来完成请求,否则将该请求发送到服务器没有多大用处。
通过查看代码,您想要执行的操作就是向页面添加两个锚点。使用JS可以很容易地做到这一点。您甚至可以通过在页面上包含一个部分视图来将两者结合起来,该视图包含您希望包含的元素,并封装在一些标记中以隐藏它们。
您可以使用按钮标记创建局部视图。
<a href='#' onclick='EditClick()'>Edit</a>
<a href='#' onclick='DeleteClick()'>Delete</a>
然后包含在您的视图中。
<div id="buttons" style="display: none;">
@Html.Partial("_ButtonView")
</div>
你的JS会变成。
function EditClick()
{
$("#buttons").toggle("display");
}
请查看这个JSFiddle以了解我的意思。
在这个问题的上下文中,我会考虑对实际的编辑操作使用Ajax请求,该请求会返回带有操作输出的Json结果。这会导致类似的结果。
$.ajax({ // ajax call starts
url: "YourArea/YourController/EditClick",
data: {"your data"},
dataType: 'json',
success: function(data) {
//handle json response
}
});
这个Ajax请求将调用控制器代码。
public JsonResult EditClick()
{
var myResult = Helper.Edit();
return Json(new { result = myResult });
}
结论:如果一个事件/动作只影响用户在UI上看到的内容(即控制可见性和启动动画),那么你可能只想使用JS/jQuery。如果需要服务器处理或从数据库中获取数据,那么可以考虑使用Ajax。
在您的示例中,似乎可以选择是使用JS将元素动态添加到页面中,还是通过Ajax执行Controller方法将元素作为部分视图。我希望这个答案能为你提供一个好的解决方案。