1

グリッドと画像ボタンがあるMVC2ビューがあります。画像ボタンをクリックすると、グリッドのcurrentPage、filter、orderByフィールドのデータが別のコントローラーに渡されます。コードは、

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MaintenanceEditableViewModel>" %>

"Image button"
<a href="<%: Url.Action("ExportToExcel", "ExportExcelButton", new { resourceId = ViewData["resourceId"], pagenum = ViewData["page"], orderBy = ViewData["orderBy"], filter = ViewData["filter"] }) %>">
<img src='<%: Url.Content("~/Content/Images/ExportExcelButton.gif") %>' /></a>

"Grid"
<%= Html.Telerik().Grid<MaintenanceAthletesResultsViewModel>()
.Name("Grid")
.TableHtmlAttributes(new { style = "font-size:8pt;" })
.HtmlAttributes(new { style = "height:335px" })
.DataKeys(k => k.Add(k2 => k2.ResultID))
.DataBinding(dataBinding => dataBinding.Ajax()
.Select("AthletesResultsAjax", "Maintenance")
...

"Action to initialize the grid in Maintenance controller"
public ActionResult AthletesResults(string id, bool editable)
{
ViewData["resourceId"] = id;
this._resourceBL.PopulateMaintenanceResourcesViewData(id, this.SelectedSport());

MaintenanceEditableViewModel model = new MaintenanceEditableViewModel { Editable = editable };
return View(model);
}

[GridAction]
public ActionResult AthletesResultsAjax(string id, int page, string orderBy, string filter)
{
List<MaintenanceAthletesResultsViewModel> model = null;

if (!string.IsNullOrEmpty(id))
{
ViewData["page"] = page;
ViewData["orderBy"] = orderBy;
ViewData["filter"] = filter;

model = this._resourceBL.GetMaintenanceAthletesResultsViewModel(int.Parse(id));
}

return View(new GridModel(model));
}

public ActionResult ExportToExcel(string resourceId, string pagenum, string orderBy, string filter)

奇妙なことに、ViewData ["resourceId"](ビューの初期化で設定)のみを渡すことができます。ViewData ["page"]、ViewData ["orderBy"]、ViewData ["filter"](グリッドajaxアクションで設定)の3つのパラメーターは渡すことができません。ExportToExcelでは3つすべてがnullであるため、ViewDataに正しく保存されていないと思います(画像ボタンが押されたときにViewDataを確認する方法がわかりません)。私は混乱していて、これについて助けが必要です。

ありがとう

4

2 に答える 2

0

これらの引数をAthletesResultsAjaxアクションに送信する方法/場所がわかりません。使用しているdataBinding.Ajax()。Select()関数のシグネチャは、アクションとコントローラー名のみを指定します。それらの値が何であるかをどのように知るのでしょうか?適切なデータをコントローラーアクションに送信するには、routeValuesオブジェクトを指定する必要があります。コードをデバッグし、ajaxアクションにブレークポイントを設定した場合、実際の値は取得されますか?私はここからかなり離れている可能性がありますが、あなたの問題は、データがViewDataにどのように格納されているかということよりもこの目的にあると思います。

于 2012-07-19T19:02:31.100 に答える
0

問題は、ViewDataが主にコントローラーからビューにデータを渡すために使用され、あなたの場合はコントローラー->ビュー->コントローラーがあることだと思います。Telerikナレッジベースには、エクスポートアクションに追加データを提供するための優れたソリューションがあると思います。Telerikナレッジベース

<%= Html.ActionLink("Export to Excel", "Export", new { page = 1, orderBy = "~", filter = "~"}, new { id = "exportLink" }) %>

<script type="text/javascript">
    function onDataBound() {
        var grid = $(this).data('tGrid');
        var $exportLink = $('#exportLink');
        var href = $exportLink.attr('href');
        href = href.replace(/page=([^&]*)/, 'page=' + grid.currentPage);
        href = href.replace(/orderBy=([^&]*)/, 'orderBy=' + (grid.orderBy || '~'));
        href = href.replace(/filter=(.*)/, 'filter=' + (grid.filterBy || '~'));
        $exportLink.attr('href', href);
    }
</script>

スクリプトは、データが受信されて画面にレンダリングされると(OnDataBound)、エクスポートリンクのURLを動的に更新します。その後、コントローラー側で適切にバインドする必要があります。

JavaScriptに精通している場合は、エクスポートボタンにクリックイベントを配置し、JavaScript側でGETリクエストを行う必要があります。次に、その醜いURLの変更を行う必要はありません。

これがお役に立てば幸いです。

于 2012-07-20T16:57:19.353 に答える