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 要素を要求すると、常に同じデータが含まれるのはなぜですか?