【发布时间】:2016-12-08 04:25:29
【问题描述】:
我正在对 MVC/Razor 应用程序进行维护,并试图了解某些代码的工作原理。网页上有一个刷新按钮,当用户点击它时,它应该会刷新一个任务列表。它似乎被破坏了,但在试图追踪它的工作原理时,我遇到了 Ajax 处理方式与 MVC 处理局部视图方式之间的冲突。我有点怀疑代码最初是为 Ajax 调用编写的,但是当他们后来决定使用 MVC 时,他们只是用部分视图方法覆盖了它;但我对它的工作原理还不够了解。
这是包含“刷新”按钮的局部视图(名为“_TasksAndAlerts.cshtml”)——
@model TasksAndAlertsModel
<section class="block-1-2 pull-right" id="TasksAndAlertsSection">
<div class="inline">
<h3>tasks/alerts<span>@Model.alerts.Count</span></h3>
</div>
<div class="inline" style="margin: 19px 0px 0px 0px;">
<!-- this is the "refresh" button, visually it's an icon -->
<button style="width: 20px; height: 20px;" id="refreshTasksAndAlerts" class="k-button"
onclick="RefreshTasksAndAlertsAjaxCall(0);return false;">
<span style="position: relative; left: -6px; top: -6px;" class="k-icon k-si-refresh"></span>
</button>
</div>
<ul class="tasks" style="overflow: auto; height: 404px">
@for (int a = 0; a < Model.lockedByCurrentUserAlerts.Count; a++)
{
@Html.Raw(HttpUtility.HtmlDecode(Model.alerts[Model.lockedByCurrentUserAlerts.ElementAt(a)].ToString()));
}
@for (int b = 0; b < Model.unassignedAlerts.Count; b++)
{
@Html.Raw(HttpUtility.HtmlDecode(Model.alerts[Model.unassignedAlerts.ElementAt(b)].ToString()));
}
@for (int c = 0; c < Model.lockedByAnotherUserAlerts.Count; c++)
{
@Html.Raw(HttpUtility.HtmlDecode(Model.alerts[Model.lockedByAnotherUserAlerts.ElementAt(c)].ToString()));
}
</ul>
</section>
这里是点击“刷新”触发的javaScript
function RefreshTasksAndAlertsAjaxCall(alertID) {
$.ajax({
type: "GET",
url: siteRoot + "Home/RefreshTasksAndAlerts/?t=" + Math.random(),
success: function (response) {
$(document.getElementById("TasksAndAlertsSection")).html(response);
},
error: function (response) {
//alert(response.responseText);
}
});
}
通过阅读 $.ajax,我得到的印象是成功值的内容将替换“getElementById("TasksAndAlertsSection")”部分中的所有内容。但是“RefreshTasksAndAlerts”返回的是一个列表,而不是 HTML。虽然可以使用某种 javaScript 来处理列表,但我看不出有什么可以实现的。
这是从 javaScript 调用的控制器代码
public PartialViewResult RefreshTasksAndAlerts(int? id)
{
LIMDUEntities db = closedKeyEntity;
return PartialView("HomePage/_TasksAndAlerts", limduDataHelper.GetTasksAndAlertsModel(HOURS_UNTIL_TASKS_SHOULD_BE_REASSIGNED, db));
}
“return”中提到的代码是一段很长的代码,最终会返回一个列表(我只是展示其中的一部分,因为它构建的不是我的问题):
public TasksAndAlertsModel GetTasksAndAlertsModel(int HOURS_UNTIL_TASKS_SHOULD_BE_REASSIGNED, LIMDUEntities db)
{
ArrayList alerts = new ArrayList();
TasksAndAlertsModel TAAM = new TasksAndAlertsModel();
TAAM.alerts = alerts;
TAAM.unassignedAlerts = UnassignedIndexes;
TAAM.lockedByAnotherUserAlerts = lockedByAnotherUserIndexes;
TAAM.lockedByCurrentUserAlerts = lockedByCurrentUserIndexes;
return TAAM;
}
我对实际发生的事情感到困惑——在我看来这两种方法相互冲突。由于返回到 $.Ajax 的数据不是 HTML,我猜它只是丢失了,而从控制器返回的部分视图就是显示的内容。如果是这样,是否需要“成功:”部分?有没有更简洁的方式来表达这一点?
【问题讨论】:
-
你怎么知道一个列表是从
RefreshTasksAndAlerts返回的?返回什么样的列表? -
我现在不知道,这是一个假设。我看到 $.Ajax 期望来自“Home/RefreshTasksAndAlerts”的某种响应 - 但该方法返回的是部分视图(“return PartialView("HomePage/_TasksAndAlerts", limduDataHelper.GetTasksAndAlertsModel") 部分返回的是在对 GetTasksAndAlertsModel 的调用中构建的列表。我试图了解 success: 函数是否真的在做任何事情,如果是,那么它在做什么?success:function 对我没有意义,我没有看不到模型的工作原理是返回局部视图。
-
我错过了——返回的是这个类,其中包括几个列表
public class TasksAndAlertsModel { public ArrayList alerts { get; set; } public List<int> unassignedAlerts { get; set; } public List<int> lockedByAnotherUserAlerts { get; set; } public List<int> lockedByCurrentUserAlerts { get; set; } public bool isOnDuty { get; set; } public bool isNotAPatient { get; set; } }
标签: javascript ajax asp.net-mvc razor