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"] (在视图初始化时设置)能够被传递。3个参数,ViewData["page"], ViewData["orderBy"], ViewData["filter"](在grid ajax action中设置)不能传递。所有 3 在 ExportToExcel 中都是空的,所以我认为它们没有正确存储在 ViewData 中(我不确定按下图像按钮时如何检查 ViewData)。我很困惑,需要帮助。

谢谢

4

2 回答 2

0

我认为问题在于 ViewData 主要用于将数据从 Controller 传递到 View,在您的情况下,您有 Controller -> View -> Controller。我认为 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)到屏幕时,脚本会动态更新 Export-links url。然后它应该在控制器端很好地绑定。

如果您更熟悉 JavaScript,那么您可能应该在导出按钮上放置一个单击事件,并在 JavaScript 端发出 GET 请求。那么你就没有做出丑陋的 url 修改。

我希望这有帮助!

于 2012-07-20T16:57:19.353 回答
0

我看不到您将这些参数发送到 AthletesResultsAjax 操作的方式/位置。您使用的 dataBinding.Ajax().Select() 函数的签名仅指定操作和控制器名称。它如何知道这些值是什么?您需要指定一个 routeValues 对象以将适当的数据发送到控制器操作。如果您调试代码并在您的 ajax 操作中放置一个断点,实际值是否通过?我可能会在这里很忙,但我认为您的问题更多的是在这方面,而不是数据如何存储在 ViewData 中。

于 2012-07-19T19:02:31.100 回答