2

mvc3 プロジェクトを mvc4 プロジェクトにアップグレードし、ターゲット フレームワークを .NET 4.0 から .NET 4.5 に変更しました (言うことが重要かどうかはわかりません)。

現在、webgrid ヘルパーを使用している場所では、ページネーションが完全に壊れています。実際、更新リクエストは 4 回送信され、Id として「displayClient」を持つ要素は html ドキュメントから完全に削除されます。

これは私のソースコードの数行です:

@{
    var grid = new WebGrid(canPage: true, canSort: true, ajaxUpdateCallback: "UpdateWebGridClient", ajaxUpdateContainerId: "displayClient", rowsPerPage: Model.RowPerPageClientId);
    grid.Bind(Model.ClientList, rowCount: Model.ClientNumber, autoSortAndPage: false);
    @grid.GetHtml(
        htmlAttributes: new { id = "grid", @class = "clientTable" },
        rowStyle: "odd",
        alternatingRowStyle: "even",
        footerStyle: "footerWebGrid",
        mode: WebGridPagerModes.All,
        numericLinksCount: 10,
        columns: grid.Columns(
            grid.Column("Id", SUResources.Admin.ClientRef, style: "ref"),
            grid.Column("FullName", SUResources.Admin.ClientFullName, style: "name"),
            grid.Column("Town", SUResources.Admin.ClientTown, style: "town"),
            grid.Column("Country", SUResources.Admin.ClientCountry, style: "country"),
            grid.Column("Email", SUResources.Admin.ClientEmail, style: "email"),
            grid.Column("PurchasedPicture", SUResources.Admin.ClientPurchasedPicture, style: "purchasedPicture"),
            grid.Column("Ca", SUResources.Admin.ClientRevenue, style: "ca"),
            grid.Column(
                style: "first-icon icons",
                format: (item) => Ajax.ActionLink(
                    " ",
                    "ClientInformation",
                    new { clientId = item.Id },
                    new AjaxOptions
                    {
                        HttpMethod = "Get",
                        UpdateTargetId = "showClientInformation",
                        InsertionMode = InsertionMode.Replace
                    },
                    new
                    {
                        @class = "record"
                    }
                )
            ),
            grid.Column(
                style: "icons",
                format:
                @<text>
                    @Html.ActionLink(" ", "Index", "SendMail", new { CustomerId = item.Id }, new { @class = "green-mail" })
                </text>
            ),
            grid.Column(
                style: "icons",
                format:
                @<text>
                    @if (item.StatusId == (short)Shootus.Domain.EnumTypes.CustomerState.Active)
                    {
                        <a onclick="ChangeCustomerStatus(this);" data-customer-id="@item.Id"> <img alt="" title="@SUResources.Admin.ClientEditionActiveUser" src="/Areas/Admin/Content/Images/Icons/ico-client-active-account.png"/></a>
                    }
                    else
                    {
                    string CustomerCurrentStatus = SUResources.Admin.ClientEditionBannedUser;

                    CustomerCurrentStatus = (item.StatusId == (short)Shootus.Domain.EnumTypes.CustomerState.NotValidated) ? SUResources.Admin.ClientEditionEmailNotValidatedUser : CustomerCurrentStatus;
                    CustomerCurrentStatus = (item.StatusId == (short)Shootus.Domain.EnumTypes.CustomerState.TurnedOff) ? SUResources.Admin.ClientEditionUnactiveUser : CustomerCurrentStatus;
                    <a onclick="ChangeCustomerStatus(this);" data-photographer-id="@item.Id"> <img alt="" title="@CustomerCurrentStatus" src="/Areas/Admin/Content/Images/Icons/ico-client-inactive-account.png"/></a>
                    }
                </text>
            ),
            grid.Column(
                style: "icons",
                format: @<text>
                    @Html.ActionLink(" ", "Delete", new { Id = item.Id }, new { @class = "delete" })
                </text>
            )
        )
    );
}
<div class="dot-line">
</div>
<div class="pager client-line-pager">
    @grid.Pager()
</div>

WebGrid のデフォルトのページャーは、css プロパティ表示で非表示になります。

生成された html で、data-swhgajax、data-swhgcallback などの新しい属性がテーブルとページャー用に生成されたコードにあることがわかりました: data-swhgcontainer、data-swhglnk、...

ページ内の外部フォームからの追加データを処理するために jQuery.ajaxPrefilter を使用します。

誰かが同じ問題を抱えていて、彼はそれを解決しましたか? この問題の原因についてのアイデアはありますか?

この投稿をお読みいただきありがとうございます。誰かが私を助けてくれることを願っています:-(

4

2 に答える 2

1

私は同様の問題に対処しました。

私の場合、AJAX post 呼び出しの後に webgrid コンテンツを更新していました。また、webgrid が更新されるたびに、ヘッダー リンクをクリックすると、もう 1 つの get 要求が送信されました。理由を見つけることができませんでした。

グリッドの並べ替えを「ajax化」して終了しました。

$("thead tr a").click(function (e) { e.preventDefault(); $.get($(this).attr('href'), function (data) { $('#idGrid').html(data) }) })

また、ページャー:

$("tfoot tr a").click(function (e) { e.preventDefault(); $.get($(this).attr('href'), function (data) { $('#Grid').html(data) }) })

ajaxUpdateContainerId webgrid パラメーターを撤回します。そして、webgrid を含む部分ビューのみを返すコントローラーを変更すると、ajax 呼び出しがあります。

if (Request.IsAjaxRequest(){}

これが誰かに役立つかどうかはわかりません...

于 2012-12-31T16:30:44.297 に答える
0

WebGrid を多用するプロジェクトを MVC3 から MVC4 にアップグレードした後、同じ問題が発生しました。プロジェクトの問題をなんとか修正できたので、解決策は同じ/類似している可能性があります

ページネーション/ソートが機能しない - グリッドに ajax スピナーを表示する jQuery イベント ハンドラーを追加し、変更する必要がありました。

$("#my-grid a").click(function () { blockGrid($("#my-grid-div")); });

$("#my-grid a").click(function () { blockGrid($("#my-grid-div")); return true; });

つまり、クリックを処理した後に true を返し、これによりページング/ソートが修正されました

複数回送信するリンク - デフォルトでは、新しいグリッドはその内部のすべてのリンクを ajax 対応にします。つまり、確認ダイアログも使用すると送信され、[OK] を選択すると再度送信されます。私の場合、私は変更しなければなりませんでした

myGrid.Column(format: (item) => Html.ActionLink(Strings.Remove, "removemember", new { id = ViewBag.GroupId, uid = item.Id }, new { onclick = "return confirmDialog(this, 'Remove Member?', 'Remove Member?')", rel = "remove" }))))

myGrid.Column(format: (item) => Html.ActionLink(Strings.Remove, "removemember", new { id = ViewBag.GroupId, uid = item.Id }, new { data_ajax = "false", onclick = "return confirmDialog(this, 'Remove Member?', 'Remove Member?')", rel = "remove" }))))

すなわち追加data_ajax = "false"

于 2013-01-23T10:08:50.243 に答える