При использовании AjaxHelper для получения частичного представления внедренные данные всегда одинаковы
Мы используем ASP.NET MVC 5 AjaxHelper
а также Ajax.BeginForm
запросить частичный просмотр. Этот запрос также нуждается в некоторых данных JSON для обновления элемента управления картой.
Часть процесса отрисовки представления работает отлично (тело таблицы заменяется строго типизированным частичным представлением), но данные JSON (встроены в data-json
атрибут div
элемент, как описано в этом ответе и извлечено в моем OnSuccess
функция) всегда имеет одинаковое значение.
Чтобы исключить код контроллера или ViewBag как виновника, я заменил данные JSON (первоначально полученные из ViewBag) прямым вызовом DateTime.Now
, Конечно же, один и тот же DateTime печатается каждый раз в updateMap()
(например, 2/11/2016+5:24:42+PM
)
Я попытался отключить кэширование и изменить метод HTML на Post, в моем 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, возвращающего частичное представление, и вместо этого вручную отображать представление в объект JSON. Почему обновленный табличный элемент отображается на экране, но когда jQuery запрашивает элемент div, у него всегда одни и те же данные?
1 ответ
Интересно... замена 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
поле сделал трюк?