在ASP.NET MVC 3中自动生成图像

时间:2011-10-31 17:28:53

标签: asp.net-mvc-3 c#-4.0

我正在使用ASP.Net和MVC 3并尝试自动生成图像。在我看来,我可能会生成1到50张图像(最终可能更多),这些图像目前是一次性丢失图像。这是因为它们显示了我的数据的当前结果,这些结果经常更新,因此生成的图像不能长时间依赖。

目前我正在动态绘制结果。用户可以选择要查看的结果以及我如何获得结果,将图形写入文件然后选取文件名并在我的视图中显示它们,但这样做不是很好,因为我不重复使用图像我宁愿不打扰存储它们。

到目前为止,我的解决方案基于以下想法Can an ASP.NET MVC controller return an Image?

在我的控制器中我有:

public ActionResult GetImage(GraphData GraphData)
    {
        Response.ContentType = "image/png";
        using (var ms = new MemoryStream())
        {
            var chart = GraphService.GetChart(GraphData.ResponseItems,GraphData.QuestionDisplaySetup,GraphData.QuestionCutOffs,250,250);
            chart.SaveImage(ms, ChartImageFormat.Png);
            ms.Seek(0, SeekOrigin.Begin);

            return File(ms.ToArray(), "image/png");
        }

    }

然后在.cshtml文件中:

foreach (var item in @Model.GraphDataList)
{
    <img src="@Url.Action("GetImage", "Download", new { GraphData = item})" alt="" /> 
}

和模特:

public class GraphData
{        
    public IEnumerable<ResultItem> ResultItems { get; set; }
    public ResultDisplaySetup ResultDisplaySetup { get; set; }
    public IEnumerable<ResultCutOff> ResultCutOffs { get; set; }
}

但正如你可能已经猜到这个问题不起作用。

如果我在.cshtml / view中执行以下操作:

Html.RenderAction("GetImage", "Download", new { GraphData = filename });

然后我在我的控制器动作中拾取对象没有任何问题,但我不能在img标签中使用它,而ASP.NET MVC null model passed to controller action告诉我@ Url.Action无法发送复杂的对象。

我完全试图自己生成序列化对象并使用RouteValueDictionary和tagbuilder编写自己的url构建器,这可能是可能的。一个例子是: Passing an object to HTML attributes

但是这个例子太简单了,显然是因为我无法完成这项工作。

我有一个额外的复杂功能,即Html.RenderAction可能无法在已发布的网站上运行,因为它不在网站的根目录(例如/ whatever / MyWebSite)这是出于安全目的而且很难改变现在。

无论如何,我似乎正在反对框架而不是它。任何人的想法?

谢谢!

1 个答案:

答案 0 :(得分:2)

在URL中传递复杂对象不是一个好主意。

相反,将它们存储在会话中,在URL中的会话中传递对象的标识符,并从操作中的会话中读取它。