【问题标题】:When using AjaxHelper to retrieve a partial view, the embedded data is always the same使用 AjaxHelper 检索局部视图时,嵌入的数据始终相同
【发布时间】:2016-05-22 22:17:57
【问题描述】:

我们使用 ASP.NET MVC 5 的 AjaxHelperAjax.BeginForm 来请求局部视图。该请求还需要一些 JSON 数据来更新地图控件。

该过程的视图渲染部分效果很好(表格主体被强类型部分视图替换),但是 JSON 数据(嵌入到 div 元素的 data-json 属性中,如 @987654321 中所述@ 并在我的 OnSuccess 函数中检索到)总是具有相同的值

为了消除控制器代码或 ViewBag 作为罪魁祸首,我将 JSON 数据(最初从 ViewBag 中检索到)替换为直接调用 DateTime.Now。果然updateMap()中每次都打印相同的DateTime(例如2/11/2016+5:24:42+PM

我尝试在AjaxOptions 中禁用缓存,并将 HTML 方法更改为 Post。

在父视图中(更改列表框选择提交表单):

@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元素时,它总是有相同的数据?

【问题讨论】:

    标签: ajax asp.net-mvc razor asp.net-mvc-5 ajaxhelper


    【解决方案1】:

    有趣...用一个很好的旧隐藏输入元素替换 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 仍然“陈旧”,而input 字段中的value 可以解决问题?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2014-05-16
      相关资源
      最近更新 更多