从控制器返回一个对象和图像

时间:2012-11-14 20:46:06

标签: asp.net-mvc

我有一个控制器,可以快速生成图像,将视图返回到视图,并在ViewBag中显示文本,

public partial class TextController : Controller
{

    public virtual ActionResult Index(bool noisy = true)
    {

    //image stream
    FileContentResult img;

    using (var mem = new MemoryStream())
    using (var bmp = new Bitmap(130, 30))
    using (var gfx = Graphics.FromImage((Image)bmp))
    {
        gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
        gfx.SmoothingMode = SmoothingMode.AntiAlias;
        gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height));

        //add question
        gfx.DrawString(text, new Font("Tahoma", 15), Brushes.Gray, 2, 3);

        //render as Jpeg
        bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
        img = File(mem.GetBuffer(), "image/Jpeg");
    }
    ViewBag.text = text;
    return img;
}

} 我想从控制器返回一个图像和ViewBag。 什么是解决方案?这有什么作用?

2 个答案:

答案 0 :(得分:2)

如果您的Action返回图片,您的ViewBag将毫无用处。当一个Action返回一个Image(通过FileResult,而不是你的方式),它被发送到浏览器,你以后不能使用ViewBag做任何事情。

如果要呈现图像和文本,最好的方法是返回标准的CSHTML视图,在该视图中可以显示图像和文本。您可以在Action中保存图像(这很奇怪但可以接受)并将URL传递给视图,该视图可以将其放在img html标记内。一个更好的方法是创建一个单独的Action来生成图像本身返回FileResult

答案 1 :(得分:0)

您可以创建一个返回局部视图的操作。您可以将动态生成的图像保存在某个物理位置,并将其引用到图像src。如果您不想保存图像,可以将图像转换为base-64编码的字符串并将其设置为src属性。