【发布时间】:2016-05-22 22:17:57
【问题描述】:
我们使用 ASP.NET MVC 5 的 AjaxHelper 和 Ajax.BeginForm 来请求局部视图。该请求还需要一些 JSON 数据来更新地图控件。
该过程的视图渲染部分效果很好(表格主体被强类型部分视图替换),但是 JSON 数据(嵌入到 div 元素的 data-json 属性中,如 @987654321 中所述@ 并在我的 OnSuccess 函数中检索到)总是具有相同的值。
为了消除控制器代码或 ViewBag 作为罪魁祸首,我将 JSON 数据(最初从 ViewBag 中检索到)替换为直接调用 DateTime.Now。果然updateMap()中每次都打印相同的DateTime(例如2/11/2016+5:24:42+PM)
我尝试在AjaxOptions 中禁用缓存,并将 HTML 方法更改为 Post。
在父视图中(更改列表框选择提交表单):
@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 助手类返回部分视图的模式,而改为 manually render a view into a JSON object。为什么更新后的tablebody在屏幕上是可见的,但是当jQuery请求div元素时,它总是有相同的数据?
【问题讨论】:
标签: ajax asp.net-mvc razor asp.net-mvc-5 ajaxhelper