我正在使用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)这是出于安全目的而且很难改变现在。
无论如何,我似乎正在反对框架而不是它。任何人的想法?
谢谢!
答案 0 :(得分:2)
在URL中传递复杂对象不是一个好主意。
相反,将它们存储在会话中,在URL中的会话中传递对象的标识符,并从操作中的会话中读取它。