无法在剃刀视图中使用扩展方法

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上有答案。

以上是关于无法在剃刀视图中使用扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

无法在局部视图中使用扩展方法

在剃刀视图上递增时出现编译错误

从剃刀视图向通过HTTP Post方法接受值的控制器操作提交值

如何将剃刀页面包含在另一个剃刀页面中?

MVC2 扩展方法在我的视图中引发错误

为啥在 MVC4 Razor 视图中找不到扩展方法?