我们使用ASP.NET MVC 5的AjaxHelper
和Ajax.BeginForm
来请求部分视图。该请求还需要一些JSON数据才能更新地图控件。
该过程的视图呈现部分工作得很好(表体被强类型的局部视图替换),但是JSON数据(嵌入data-json
元素的div
属性中在this answer中描述并在我的OnSuccess
函数中检索到的)始终具有相同的值。
为了消除控制器代码或ViewBag作为罪魁祸首,我直接调用DateTime.Now
替换了JSON数据(最初从ViewBag中检索)。果然,每次在updateMap()
打印相同的DateTime(例如2/11/2016+5:24:42+PM
)
我已尝试在我的AjaxOptions
中禁用缓存并将HTML方法更改为发布。
在父视图中(更改ListBox选择提交表单):
@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>
}
我犹豫是否放弃了返回部分视图而不是manually render a view into a JSON object的MVC辅助类的模式。为什么更新的表体在屏幕上可见,但是当jQuery请求div元素时,它总是具有相同的数据?
答案 0 :(得分:0)
有趣...用一个好的旧隐藏输入元素替换div工作。现在每次都会检索新数据。
此
<div id="geoJsonData" data-json="@Url.Encode(DateTime.Now.ToString())"></div>
成为这个
<input id="geoJsonData" type="hidden" value="@Url.Encode(DateTime.Now.ToString())" />
我想知道为什么data-json
div
中的value
仍然“陈旧”而input
字段的<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
成功了?