在MVC中的Actions之间传递数据

时间:2018-02-13 04:20:39

标签: c# asp.net-mvc selectpdf

我有一个包含图表和表格数据的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 []值。它显示为null。所以图表数据没有得到pdf

请帮我解决这个问题

2 个答案:

答案 0 :(得分:2)

请注意:

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

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

保留语法:

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

Peek语法:

String data = TempData.Peek("myData");

答案 1 :(得分:0)

试试这个

/spaceships/$spaceship_id