0

ASP.NET MVC 5 を使用AjaxHelperAjax.BeginFormて、部分ビューを要求します。このリクエストには、マップ コントロールを更新するための JSON データも必要です。

プロセスのビュー レンダリング部分はうまく機能しますが (テーブル本体は厳密に型指定された部分ビューに置き換えられます)、JSON データ (この回答で説明されているように要素のdata-json属性に埋め込まれ、関数で取得されます)は常に同じ値divOnSuccess

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

4

1 に答える 1

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-jsondiv「古い」ままなのだろうか?valueinput

于 2016-02-11T23:09:51.797 に答える