我们使用 ASP.NET MVC 5AjaxHelper
并Ajax.BeginForm
请求部分视图。该请求还需要一些 JSON 数据来更新地图控件。
该过程的视图渲染部分效果很好(表体被强类型的部分视图替换),但 JSON 数据(嵌入到元素的data-json
属性中,div
如本答案OnSuccess
中所述并在我的函数中检索)始终具有相同的值。
为了消除控制器代码或 ViewBag 作为罪魁祸首,我将 JSON 数据(最初从 ViewBag 中检索到)替换为直接调用DateTime.Now
. 果然,每次在updateMap()
(例如,2/11/2016+5:24:42+PM
)中打印相同的DateTime
我尝试禁用缓存,并将 HTML 方法更改为 Post,在我的AjaxOptions
.
在父视图中(更改列表框选择提交表单):
@model string
@{
ViewBag.Title = "Project List";
AjaxOptions ajaxOpts = new AjaxOptions
{
UpdateTargetId = "tableBody",
OnSuccess = "updateMap",
HttpMethod = "Post",
AllowCache = false
};
}
@using (Ajax.BeginForm("GetProjectsData", ajaxOpts))
{
<fieldset>
<legend>Project State</legend>
<div class="editor-field">
@Html.ListBox("selectedStates", ViewBag.StatesList as MultiSelectList,
new { @class = "chzn-select", data_placeholder = "Choose States...", style = "width:350px;", onchange = "$(this.form).submit();" })
</div>
</fieldset>
}
<table class="table">
<thead>
<tr>
<th>
Project Name
</th>
<th>
Project Firm
</th>
<th>
Project Location
</th>
<th>
Building Type
</th>
<th>
Project Budget
</th>
<th></th>
</tr>
</thead>
<tbody id="tableBody">
@Html.Action("GetProjectsData", new { selectedStates = Model })
</tbody>
</table>
<script>
function updateMap() {
var jsonData = $("#geoJsonData").attr("data-json");
var decoded = decodeURIComponent(jsonData);
console.log(decoded); // always prints same value
}
</script>
部分观点:
@model IEnumerable<OurModel>
<div id="geoJsonData" data-json="@Url.Encode(DateTime.Now.ToString())"></div>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.NAME)
</td>
<td>
@Html.DisplayFor(modelItem => item.COMPANY_NAME)
</td>
<td>
@Html.DisplayFor(modelItem => item.STATE)
</td>
<td>
@Html.DisplayFor(modelItem => item.BUILDING_TYPE)
</td>
<td>
@Html.DisplayFor(modelItem => item.BUDGET_AMT)
</td>
</tr>
}
我不愿放弃 MVC 助手类返回部分视图的模式,而是手动将视图呈现为 JSON 对象。为什么更新后的表体在屏幕上可见,但是当 jQuery 请求 div 元素时,它总是有相同的数据?