为什么ViewData不起作用

时间:2012-07-19 18:46:56

标签: telerik-grid telerik-mvc

我有MVC2视图,其中有一个网格和图像按钮。单击图像按钮时,它会将网格的currentPage,filter和orderBy fields ...的数据传递给另一个控制器。代码是,

<%@ 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”](在网格中设置ajax动作)。 ExportToExcel中的所有3都为null,因此我认为它们未正确存储在ViewData中(我不确定如何在按下图像按钮时检查ViewData)。我很困惑,需要帮助。

由于

2 个答案:

答案 0 :(得分:1)

我不知道你将这些论据发送到AthletesResultsAjax行动的方式/地点。 dataBinding.Ajax()的签名。您正在使用的Select()函数仅指定操作和控制器名称。如何知道这些价值观是什么?您需要指定routeValues对象以将适当的数据发送到控制器操作。如果您调试代码并在ajax操作中放置断点,那么实际值是否会通过?我可能会离开这里,但我认为你的问题更多的是关于数据如何存储在ViewData中。

答案 1 :(得分:1)

我认为问题在于ViewData主要用于将数据从Controller传递到View,在你的情况下你有Controller - &gt;查看 - &gt;控制器。我认为Telerik知识库有一个很好的解决方案,如何为您的导出操作提供额外的数据。 Telerik Knowledge Base

<%= 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>

该脚本在收到数据时动态更新Export-links网址&amp;渲染(OnDataBound)到屏幕。然后它应该很好地绑定在Controller端。

如果您对JavaScript更熟悉,那么您应该将click事件放到导出按钮并在JavaScript端发出GET请求。然后你没有做那些难看的网址修改。

我希望这有帮助!