0

我们希望在我们的 Orchard 视图中共享以下逻辑。

@helper CreateImgFromMediaPart(dynamic mediaPart, int width = 150)
{
    var imgSrc = mediaPart != null ? mediaPart.MediaUrl : string.Empty;
    var imgAlt = mediaPart != null ? mediaPart.AlternateText : string.Empty;
    <img alt="@imgAlt" src="@imgSrc" />
}

为了实现这个目标,我们创建了一个替代调用Media-Image.SizedThumbnail.cshtml来呈现Media_Image形状。

Media-Image.SizedThumbnail.cshtml - 创建共享备用

@using Orchard.ContentManagement
@using Orchard.MediaLibrary.Models
@using Orchard.Utility.Extensions
@model dynamic

    @{
        ContentItem contentItem = Model.ContentItem;
        var media = contentItem.As<MediaPart>();
        var image = contentItem.As<ImagePart>();
        var width = media.Width != null ? media.Width : 200; // get the width
    }

    <div>
        <img src="@Display.ResizeMediaUrl(
                       Width: width, 
                       Mode: "max", 
                       Alignment: "middlecenter", 
                       Path: media.MediaUrl)" />
    </div>

我们可以用 成功地调用它Display(BuildDisplay(mediaPart, "ResizeThumbnail))。它几乎可以工作。挑战是通过Width我们希望图像成为的。

MyView.cshtml - 尝试传递宽度。

// Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:
// 'Orchard.MediaLibrary.Models.MediaPart' does not contain a definition for 'Width'
// This is odd to me, because mediaPart is dynamic
mediaPart.Width = 200;
@Display(BuildDisplay(mediaPart, "SizedThumbnail")

// Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
// The best overloaded method match for
// BuildDisplay(Orchard.ContentManagement.IContent, string, string)' 
// has some invalid arguments
var mediaPartExpando = MyFunctions.ToDynamic(mediaPart);
mediaPartExpando.Width = 200;
@Display(BuildDisplay(mediaPartExpando, "SizedThumbnail")

// System.NullReferenceException: Object reference not set to an instance of an object.
var mediaPartExpando = MyFunctions.ToDynamic(mediaPart);
mediaPartExpando.Width = 200;
var mediaPartAgain = mediaPartExpando as IContent;
@Display(BuildDisplay(mediaPartAgain, "SizedThumbnail")

我显然在与编译和运行时作斗争。我们如何通过 BuildDisplay 将宽度传递给备用?

4

2 回答 2

1

首先,从视图中调用 BuildDisplay 并不好。如果可能的话,如果负责创建此 MyView.cshtml 的驱动程序或控制器这样做会更好。

其次,BuildDisplay 返回的是一个形状,您可以在其中动态添加属性。所以你应该能够做到这一点:

@Display(BuildDisplay(mediaPart, "SizedThumbnail").Width(200))
于 2014-08-22T12:25:58.340 回答
0

ViewBag直到我们找到更好的答案:

MyView.cshtml - 尝试传递宽度。

 ViewBag.ResizedThumbnailWidth = 200;
 @Display(BuildDisplay(mediaPart, "SizedThumbnail"))

Media-Image.SizedThumbnail.cshtml - 共享备用

@using Orchard.ContentManagement
@using Orchard.MediaLibrary.Models
@using Orchard.Utility.Extensions
@model dynamic

    @{
        ContentItem contentItem = Model.ContentItem;
        var media = contentItem.As<MediaPart>();
        var image = contentItem.As<ImagePart>();
        var width = ViewBag.ResizedThumbnailWidth ?? 200;
    }

    <div>
        <img src="@Display.ResizeMediaUrl(
                       Width: width, 
                       Mode: "max", 
                       Alignment: "middlecenter", 
                       Path: media.MediaUrl)" />
    </div>
于 2014-08-22T02:55:10.260 回答