2016-03-09 81 views
1

我试图从本地存储(而不是内容文件夹)中显示图像。我使用的图像标签看起来像这样。无法在剃刀视图中使用扩展方法

@if (Model.PreviousCoverPic != null) 
{ 
    <img src="@Url.Action("ServeImage", "Profile",new {path = Model.PreviousCoverPic})" alt="Previous Profile Pic" /> 
} 

我提出的ServerImage方法的扩展方法,因为它会由一个以上的控制器一起使用。这里是该方法的代码:

public static ActionResult ServeImage(this System.Web.Mvc.Controller controller, string path) 
{ 
    Stream stream = new FileStream(path, FileMode.Open); 
    FileResult fileResult = new FileStreamResult(stream, "image/jpg"); 
    return fileResult; 
} 

它返回图像的FileResult,以便它可以显示。但是,渲染视图时不显示图像。我检查了Model.PreviousCoverPic值,它不为空。我在这里错过了什么?我怎样才能实现从本地文件夹显示方法?另外,我在this问题后面跟着回答,并添加了包含扩展方法的类的名称空间,但该图像仍未在视图中呈现。

+0

您是否在cshtml中包含了定义扩展方法的命名空间? –

+0

我在Web.config文件中包含名称空间,以便它包含在所有cshtml文件中。 – avidProgrammer

+1

我不认为它会这样工作。将它包含在你的cshtml中,让我知道它是如何工作的 –

回答

2

根据以下来源

Can MVC action method be static or extension method

而这个答案

extend ASP.NET MVC action method,How to do return View

扩展方法不会与路由Url.Action工作。您可以使用继承来创建具有该操作的基类。这样,所有继承的类将具有该操作并且调用Url.Action将是有效的。

public abstract class MyBaseController : Controller { 
    public ActionResult ServeImage(string path) {...} 
} 

public class ConcreteController : MyBaseController {...} 
+0

谢谢,我以这种方式工作。我认为使用扩展方法会更清洁。有没有办法使用扩展方法工作? – avidProgrammer

+0

目前我想不出任何东西,还没有遇到任何有关能够做到这一点的文档。 – Nkosi

+0

你说得对。操作方法不能用作扩展方法。看看[这](http://stackoverflow.com/questions/32514087/extend-asp-net-mvc-action-method-how-to-do-return-view)的问题。请修改您的答案以包含该信息。也可以返回多个内容类型,如“image/jpg”,“image/png”等。 – avidProgrammer