无法在剃刀视图中使用扩展方法
Posted
技术标签:
【中文标题】无法在剃刀视图中使用扩展方法【英文标题】:Unable to use extension method in razor view 【发布时间】:2016-03-09 12:21:14 【问题描述】:我正在尝试显示本地存储(不是内容文件夹)中的图像。我使用的图片标签是这样的。
@if (Model.PreviousCoverPic != null)
<img src="@Url.Action("ServeImage", "Profile",new path = Model.PreviousCoverPic)" />
我将 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问题中的答案添加了包含扩展方法的类的名称空间,但图像仍然没有在视图中呈现。
【问题讨论】:
你的cshtml中是否包含了定义扩展方法的命名空间? 我在 Web.config 文件中包含了命名空间,以便它包含在所有 cshtml 文件中。 我不认为它会那样工作。将其包含在您的 cshtml 中并告诉我它是如何工作的 我还用@using WebProj.Extensions.Controller将它添加到了cshtml文件中,但它仍然不起作用。 【参考方案1】:根据以下来源
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 ...
【讨论】:
谢谢,我就是这样工作的。我认为使用扩展方法会更干净。有没有办法使用扩展方法让它工作? 我现在想不出任何东西,也没有遇到任何关于能够做到这一点的文档。 你是对的。动作方法不能用作扩展方法。看看this 的问题。请修改您的答案以包含该信息。我还可以返回多个内容类型,例如“image/jpg”、“image/png”等。 标头一次只包含一种类型。我建议将文件映射到它的 mime 类型并将其包含在流结果中。但那完全是另一个问题。 SO上有答案。以上是关于无法在剃刀视图中使用扩展方法的主要内容,如果未能解决你的问题,请参考以下文章