在另一个视图ASP.NET MVC4中将视图显示为图像

时间:2014-06-03 15:11:26

标签: asp.net-mvc asp.net-mvc-4 razor

我创建了一个视图jpegImage.cshtml(不是局部视图),它有jpegImageController。控制器具有Index方法,即将图像写入输出流。 在我的主视图testimage.cshtml中,我将jpegImage视图称为<img src="jpegImage.cshtml" />,但未显示任何图像,而如果我按照http://<server>/jpegImage/Index之类的网址调用视图,则返回图像。

我有什么遗失的吗?

以下是我的代码

-----------JpegImageController.cs----------------

public ActionResult JpegImage()
        {
            Random random = new Random();
            string s = "";
            for (int i = 0; i < 6; i++)
                s = String.Concat(s, random.Next(10).ToString());
            this.Session["CaptchaImageText"] = s;
            CaptchaImage ci = new CaptchaImage(this.Session["CaptchaImageText"].ToString(),200, 40, "Century Schoolbook");

            this.Response.Clear();
            this.Response.ContentType = "image/jpeg";

            // Write the image to the response stream in JPEG format.
            ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);

            // Dispose of the CAPTCHA image object.
            ci.Dispose();
            return View();
        }

CaptchaImage is class which is generating the image

--------------jpegImage.cshtml------------
@Html.BeginForm()

--------testImage.cshtml--------------

< img src="@Url.Content("~/views/JpegImage/JpegImage.cshtml")" alt="Captcha" />

2 个答案:

答案 0 :(得分:0)

网络服务器不直接提供jpegImage.cshtml等视图。这就是为什么当您在图片代码中请求时,您的视图无法投放:

<img src="jpegImage.cshtml" />

相反,视图将作为返回ViewResult的操作方法的结果呈现。反过来,当您请求路由到操作方法的URL时,将调用操作方法。这就是你的

请求
http://<server>/jpegImage/Index

会返回图像。换句话说,您的图片代码应为

<img src="jpegImage/Index" />

(您可以省略&#34;索引&#34;部分,因为这可能是您路线中的默认配置)。

顺便说一下,如果你需要的只是让你的行动返回一张图片,你根本不需要返回ViewResult或者拥有一个视图(.cshtml文件)。考虑只返回FileResult

public ActionResult Image(string id)
{
    /* Generate your CaptchaImage and somehow get hold of a stream */
    return base.File(steam, "image/jpeg");
}

由于我不知道您用于生成图像的库,我无法告诉您如何获取Stream,但您可以自己解决这个问题。

答案 1 :(得分:0)

删除你的jpegImage.cshtml。没有必要和浪费生成。

JpegImageController.cs 操作更改为:

public FileResult JpegImage()
{
    Random random = new Random();
    string s = "";
    for (int i = 0; i < 6; i++)
        s = String.Concat(s, random.Next(10).ToString());
    Session["CaptchaImageText"] = s;

    using (CaptchaImage ci = new CaptchaImage(Session["CaptchaImageText"].ToString(), 200, 40, "Century Schoolbook"))
    {

        // Write the image to a stream in JPEG format.
        var output = new MemoryStream();
        ci.Image.Save(output, ImageFormat.Jpeg);

        return File(output, "image/jpeg");
    }
}

testImage.cshtml 中,只需使用:

<img src="@Url.Action("JpegImage")" alt="Captcha" />