使用 AjaxHelper 检索分部视图时,嵌入的数据始终相同
When using AjaxHelper to retrieve a partial view, the embedded data is always the same
我们使用 ASP.NET MVC 5 的 AjaxHelper
和 Ajax.BeginForm
来请求部分视图。该请求还需要一些 JSON 数据才能更新地图控件。
该过程的视图呈现部分效果很好(table 主体被强类型局部视图替换),但是 JSON 数据(嵌入到 data-json
div
元素的属性,如 this answer 中所述并在我的 OnSuccess
函数中检索)始终具有相同的值。
为了消除控制器代码或 ViewBag 作为罪魁祸首,我用直接调用 DateTime.Now
替换了 JSON 数据(最初从 ViewBag 检索)。果然,在updateMap()
(例如2/11/2016+5:24:42+PM
)
中每次都打印相同的DateTime
我试过在 AjaxOptions
.
中禁用缓存,并将 HTML 方法更改为 Post
在父视图中(更改 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>
}
我犹豫是否放弃 MVC 助手 类' 返回局部视图的模式,而是 manually render a view into a JSON object。为什么更新后的 tablebody 在屏幕上可见,但当 jQuery 请求 div 元素时它始终具有相同的数据?
有趣...用一个很好的旧隐藏输入元素替换 div 有效。现在每次都检索新数据。
这个
<div id="geoJsonData" data-json="@Url.Encode(DateTime.Now.ToString())"></div>
变成了这个
<input id="geoJsonData" type="hidden" value="@Url.Encode(DateTime.Now.ToString())" />
我想知道为什么 div
中的 data-json
仍然是 "stale" 而 input
字段中的 value
起作用了?
我们使用 ASP.NET MVC 5 的 AjaxHelper
和 Ajax.BeginForm
来请求部分视图。该请求还需要一些 JSON 数据才能更新地图控件。
该过程的视图呈现部分效果很好(table 主体被强类型局部视图替换),但是 JSON 数据(嵌入到 data-json
div
元素的属性,如 this answer 中所述并在我的 OnSuccess
函数中检索)始终具有相同的值。
为了消除控制器代码或 ViewBag 作为罪魁祸首,我用直接调用 DateTime.Now
替换了 JSON 数据(最初从 ViewBag 检索)。果然,在updateMap()
(例如2/11/2016+5:24:42+PM
)
我试过在 AjaxOptions
.
在父视图中(更改 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>
}
我犹豫是否放弃 MVC 助手 类' 返回局部视图的模式,而是 manually render a view into a JSON object。为什么更新后的 tablebody 在屏幕上可见,但当 jQuery 请求 div 元素时它始终具有相同的数据?
有趣...用一个很好的旧隐藏输入元素替换 div 有效。现在每次都检索新数据。
这个
<div id="geoJsonData" data-json="@Url.Encode(DateTime.Now.ToString())"></div>
变成了这个
<input id="geoJsonData" type="hidden" value="@Url.Encode(DateTime.Now.ToString())" />
我想知道为什么 div
中的 data-json
仍然是 "stale" 而 input
字段中的 value
起作用了?