3

我已经在谷歌上搜索了很长时间,但还没有找到我需要的东西。这是我们的场景。

我们有一个带有 Razor 的 MVC4 应用程序。在一个屏幕上,我们使用 Telerik Editor 控件来保存文本和图像。这些被格式化为 HTML 并存储在数据库中。图像存储为 byte[] 数据,并且 html src“路径”使用不同的文件名进行更新。

稍后用户来并想要查看数据。因为任何图像都存储在数据库中,我想我可以使用此处找到的示例将字节数组转换为图像并在 Razor 视图中显示,我将使用带有 Url.Action 的标签更新 HTML 中的标签,然后渲染所有这些HTML 到屏幕。

替换图像标记后我的动态生成的 html 代码示例是

<p>testing the image blah</p><p><img src="@Url.Action("getImg", "Responses", new { id = 1 }) " alt="Response Image" /> </p>

但是如果我使用 HTML.Raw(Text),它不会处理图像。如果我只是将该图像标签复制到视图中,效果很好。

我的问题是,如何在视图上正确呈现使用 Razor 语法代码动态创建的 HTML?

*************** 更多细节 ***********

更多细节有助于澄清我在做什么。我有两个模型 Response 和 ResponseImages。

public class Response : TrackableBase 
{
    [Key]
    public int ResponseId { get; set; }
    public string Subject{ get; set; }

    [MaxLength]
    public string Text { get; set; }

    public virtual ICollection<ResponseImage> ResponseImages { get; set; }
}

公共类 ResponseImage : TrackableBase { [Key] public int ResponseImageId { get; 放; }

    public int ResponseId { get; set; }
    [ForeignKey("ResponseId")]
    public virtual Response Response { get; set; }

    public string FilePath { get; set; }
    public string FileName { get; set; }
    public string FileExtension { get; set; }
    public byte[] Image {get; set;}


}

Response.Text 存储来自 Telerik 编辑器的 HTML。我使用 HTMLAgilitypack 循环遍历 HTML 中的所有图像,并从这些图像中创建 ResponseImage 记录,其中 ResponseImage.FilePath 是我用作返回存储在 Response.Text 中的 HTML 代码的链接(所有图像都更新为不同的名称/路径)。

在我的 Details.cshtml 屏幕上,我想查看 Response.Text 的详细信息。从数据库中,我的 Response.Text 如下所示:

<p>hjjk</p><p>
<img alt="" height="144" src="/Content/Editor_Images/UserFiles/JKULBIDA/Images/Koala_635019802303066655.jpg" width="164"></p>

但是,因为我将图像存储在数据库中而不是文件系统中,所以我再次使用 HTMLAgility 包并使用 Razor 语法更新所有图像标签以使用 @Url.Action。我的新 HTML 看起来像这样

<p>hjjk</p><p><img src="@Url.Action("getImg", "Responses", new { id = 4 }) " alt="Response Image" /> </p>

最后,在我的视图上,我想显示我的数据,但也要正确格式化 HTML。所以我打电话给@Html.Raw(Model.Text) 并且我的图片标签不起作用:(

*****更新结束****

在此先感谢,因为我非常坚持这一点。

4

1 回答 1

1

不确定您如何存储数据,但假设您的数据中有 ID 和文本,而不是使用 Razor 语法构建字符串,您的视图应该包含所有必要的标记,并使用数据中的变量它。

例如,如果您有一个局部视图,其中您的模型是具有属性 Id 和描述的图像,那么您的局部视图将如下所示:

<img src="@Url.Action("getImg", "Responses", new { id = Model.ID })"
    alt="@Model.Description">

然后,当您将对象传入部分时,它将正常呈现,而不会对 Razor HTML 进行任何时髦的解析。

编辑

如果我理解您的编辑,您正在运行一些代码来将标签的src属性转换img为您想要的。但是,您将其转换为 Razor 字符串,而不是有效的 HTML - 您要做的是在分配 时实际构建图像的 URL src,而不是稍后在视图中时构建图像的 URL。

为此,我相信这将使您继续前进:

string imageUrl = RouteTable.Routes.GetVirtualPath(
    System.Web.HttpContext.Current.Request.RequestContext,
    new RouteValueDictionary(new { 
        controller = "Responses", 
        action = "getImg",
        id = Model.ID
    })).VirtualPath;

这将基于代码中的这些参数构建 MVC URL,因此您可以将其直接转储到src属性中。如果您正在处理奇怪的路由或类似的事情,您可能需要稍微调整一下 - 但我认为它应该适用于基本设置。

如果您在控制器内部,我相信您可以做ControllerContext.RequestContext,甚至可能只是ControllerContext代替获得静态电流。

于 2013-04-22T14:49:59.847 回答