我有一个控制器,可以快速生成图像,将视图返回到视图,并在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。 什么是解决方案?这有什么作用?
答案 0 :(得分:2)
如果您的Action返回图片,您的ViewBag将毫无用处。当一个Action返回一个Image(通过FileResult,而不是你的方式),它被发送到浏览器,你以后不能使用ViewBag做任何事情。
如果要呈现图像和文本,最好的方法是返回标准的CSHTML视图,在该视图中可以显示图像和文本。您可以在Action中保存图像(这很奇怪但可以接受)并将URL传递给视图,该视图可以将其放在img
html标记内。一个更好的方法是创建一个单独的Action来生成图像本身返回FileResult
答案 1 :(得分:0)
您可以创建一个返回局部视图的操作。您可以将动态生成的图像保存在某个物理位置,并将其引用到图像src。如果您不想保存图像,可以将图像转换为base-64编码的字符串并将其设置为src属性。