我们希望在我们的 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 将宽度传递给备用?