1

我有一个包含图表和表格数据的 mvc Web 应用程序。

设想:

我在 Index 方法中填充数据并将模型返回到视图以进行绑定。在视图中,表与数据绑定。我也想用相同的数据绑定图表。图表与子操作绑定。我在 Index 方法中设置 TempData[] 对象并在 Chart 操作中检索相同的对象。

代码:

控制器

        public ActionResult Index()
    {
        var data = new List<MyModel>()
        {
            new MyModel { Text = "Name1", Value = 123 },
            new MyModel { Text = "Name2", Value = 24 },
        };
        TempData["data"] = data;
        return View(data);
    }

    public FileContentResult Chart()
    {
        List<MyModel> data = TempData["data"] as List<MyModel>;
        var chart = new Chart
        {
            Width = 300,
            Height = 450,
       };
        if (data != null)
        {
            chart.ChartAreas.Add("");
            chart.Series.Add("");
            chart.Series[0].ChartType = SeriesChartType.Column;
            foreach (var q in data)
            {
                chart.Series[0].Points.AddXY(q.Text, Convert.ToDouble(q.Value));
            }
        }
        using (var chartimage = new MemoryStream())
        {
            chart.SaveImage(chartimage, ChartImageFormat.Png);
            return File(chartimage.GetBuffer(), @"image/png");
        }
    }

    public async Task<ActionResult> Export()
    {
        var converter = new HtmlToPdf();
        var baseAddress = new Uri("http://localhost:4545/");
        var cookieContainer = new System.Net.CookieContainer();

        using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
        using (HttpClient client = new HttpClient(handler) { BaseAddress = baseAddress })
        {
            var result = await client.GetAsync("/Home/Index");
            var htmlString = await result.Content.ReadAsStringAsync();

            var doc = converter.ConvertHtmlString(htmlString, baseAddress.ToString());
            doc.Save(System.Web.HttpContext.Current.Response, true, "test.pdf");
            doc.Close();
        }
        return null;
    }

看法:

<div class="row">
@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
<div class="col-md-12">
    <table>
        @{
            foreach (var item in Model)
            {
                <tr>
                    <td>
                        @item.Text
                    </td>
                    <td>
                        @item.Value
                    </td>
                </tr>
                }
        }
    </table>
</div>
<div class="col-md-12">
    <img src="@Url.Action("Chart")" />
    <input type="submit" value="Filter" />
</div>
}
<div class="col-md-12">
    @using (Html.BeginForm("Export", "Home", FormMethod.Post))
    {
        <input type="submit" value="Export" />
    }
</div>

问题:

在这里,我使用 SelectPdf 将网页导出为 pdf。当我单击导出按钮时,它会获取网页的内容,以便再次呈现索引和图表。但在这里我没有得到 tempdata[] 值。它显示为空。所以图表数据没有进入pdf

请帮我解决这个问题

4

2 回答 2

3

请注意 :

ASP.NET MVC 中的 TempData 可用于存储可用于后续请求的临时数据。TempData 将在后续请求完成后被清除。

因此,要在后续请求中保留 TempData 的值,您需要调用 TempData.Keep() 或 Peek("tempdata name")。

保持语法:

String data = TempData["myData"] as string;
TempData.Keep();

窥视语法:

String data = TempData.Peek("myData");
于 2018-02-13T05:07:43.923 回答
0

尝试这个

List<MyModel> data = (List<MyModel>)TempData.Peek("data");
于 2018-02-13T04:55:54.387 回答