日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Orchard: Shape展现介绍

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Orchard: Shape展现介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????一個shape是一個動態數據模型,shape的目的是用來代替ASP.NET MVC中靜態的視圖模型,Orchard使用的模型可以在運行時更新。本文將介紹shape的概念以及如何使用它。如果你還不知道module的基本概念和開發可以看我之前寫的文章,這里就不再重復,如果不知道.Net的動態對象的可以看看Creating and Using Dynamic Objects。

介紹Shapes

????Shapes是一個動態數據模型,它使用shape templates來展現UI,Shape templates是一個標記片段。Shapes的示例包括menus, menu items, content items, documents, and messages。Shape是一個派生自Orchard.DisplayManagement.Shapes.Shape 類的數據模型對象。Shape 類不會實例化,而是在運行時通過shape工廠來生成。缺省的shape工廠是Orchard.DisplayManagement.Implementation.DefaultShapeFactory。shape工廠生成的shape是一個動態對象。

注意: Dynamic objects是.NET 4.0才有的功能。作為一個動態對象,shape在運行時暴露它的成員,而不是在編譯期。而在ASP.NET MVC中模型對象是一個在編譯器定義的靜態對象。

??? Shape信息由shape的ShapeMetadata屬性來描述,這些信息包括shape的type、display type、position、prefix、wrappers、alternates、child content和一個WasExecuted 布爾值。我們可以通過以下代碼來獲取shape的元信息:

var shapeType = shapeName.Metadata.Type; ??? 當shape對象生成之后,我們如何展現它呢?shape template是一個HEML代碼片段,它負責顯示shape。我們還可以不使用shape template而直接通過使用shape attribute (Orchard.DisplayManagement.ShapeAttribute) 來寫代碼顯示shape。

Creating Shapes

????對于模塊開發人員來說,需要知道我們是在driver中把數據轉化成模板來顯示的。Driver派生自Orchard.ContentManagement.Drivers.ContentPartDriver,一般都會重載類的DisplayEditor 方法。DisplayEditor 方法返回一個ContentShapeResult對象,這個對象與ASP.NET MVC中的ActionResult類似。

????ContentShape 方法生成一個shape并且把它返回在一個ContentShapeResult 對象中。ContentShape是overloaded的方法,最常用的是傳入兩個參數(shape 類型和定義shape的動態函數表達式)。動態函數表達式定義這個shape,shape類型命名這個shape并且綁定這個shape到展現模板上。(Shape類型命名規約在本文后面會介紹)

????以下是一個driver的Display方法示例,這個方法用來顯示一個Map part:

View Code protected override DriverResult Display(

MapPart part,
string displayType, dynamic shapeHelper)

{

return ContentShape("Parts_Map",

()
=> shapeHelper.Parts_Map(

Longitude: part.Longitude,

Latitude: part.Latitude));

}
??? 這個表達式使用一個動態對象shapeHelper來定義一個Parts_Map shape 和它的屬性。表達式在shape上添加了一個Longitude 屬性,并且與part的Longitude 屬性綁定起來;同樣增加了一個Latitude 屬性。Display返回ContentShape方法生成的對象。

????下面的示例演示了一個關于Map part的完整的driver 類,Display 方法用來顯示地圖,Editor 方法標記了"GET",用來編輯地圖信息,標記了"POST"的Editor方法用來重新顯示用戶提供值的編輯視圖。

View Code using Maps.Models;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;

namespace Maps.Drivers
{
public class MapDriver : ContentPartDriver<MapPart>
{
protected override DriverResult Display(
MapPart part,
string displayType, dynamic shapeHelper)
{

return ContentShape("Parts_Map", () => shapeHelper.Parts_Map(
Longitude: part.Longitude,
Latitude: part.Latitude));
}

//GET
protected override DriverResult Editor(
MapPart part, dynamic shapeHelper)
{

return ContentShape("Parts_Map_Edit",
()
=> shapeHelper.EditorTemplate(
TemplateName:
"Parts/Map",
Model: part,
Prefix: Prefix));
}
//POST
protected override DriverResult Editor(
MapPart part, IUpdateModel updater, dynamic shapeHelper)
{

updater.TryUpdateModel(part, Prefix,
null, null);
return Editor(part, shapeHelper);
}
}
}
  標記"GET"的Editor方法使用ContentShape方法來生成一個編輯模板代表的shape對象。在這個例子當中,類型名是Parts_Map_Edit,shapeHelper 對象生成一個EditorTemplate shape。這是一個有一個TemplateName 屬性和Model 屬性的shape。TemplateName 屬性表示模板的部分路徑,"Parts/Map" 會告訴Orchard去"Views/EditorTemplates/Parts/Map.cshtml"中查找模板。

這里的Model 屬性代表part的不帶文件擴展名的模型文件名。

Shapes and Templates命名約定

??? 命名約定是很多架構現在采用的一種方式,它可以減少一些復雜性,只要保證遵守一定的約定即可。假使我們要生成一個顯示地圖的Map part,它又精度和緯度兩個屬性。對shape type的命名可能就是Parts_Map。如果shape命名為Parts_Map,那么Orchard 會在views/parts/Map.cshtml中查找模板

下表匯總了shape type和模板的命名約定:

應用到

Template命名約定

Template示例

Shape Type 示例

Zone

Zone-(zone name)

Zone-AsideSecond.cshtml

Zone__AsideSecond

Menu

Menu-(menu name)

Menu-main.cshtml

Menu__main

MenuItem

MenuItem-(menu name)

MenuItem-main.cshtml

MenuItem__main

Content

Content-(content type)

Content-BlogPost.cshtml

Content__BlogPost

Content

Content-(content id)

Content-42.cshtml

Content__42

Content

Content.(display type)

Content.Summary.cshtml

Content_Summary__Page

Content

Content-(content type).(display type)

Content-Page.Summary.cshtml

Content_Summary__Page

Content.Edit

Content-(content type).Edit

Content-Page.Edit.cshtml

Content_Edit__Page

Widget

Widget-(content type)

Widget-HtmlWidget.cshtml

Widget__HtmlWidget

Widget

Widget-(zone name)

Widget-AsideSecond.cshtml

Widget__AsideSecond

Fields/Common.Text

Fields/Common.Text-(text field name)

Fields/Common.Text-Location.cshtml
(if the field's Name property equals "Location")

Fields_Common_Text__Location

模板在項目中的位置應該遵守以下規則:

  • Content item shape 模板放在views/items 目錄
  • Parts_ shape 模板放在views/parts 目錄
  • Fields_ shape 模板放在views/fields 目錄下
  • EditorTemplate shape 模板放在views/EditorTemplates/template name 目錄。例如,模板名是"Parts/Routable.RoutePart" 的EditorTemplate放在views/EditorTemplates/Parts/Routable.RoutePart.cshtml
  • 其他shape模板放在views 目錄下

注意:模板擴展名可以是任意支持的視圖引擎支持的擴展名,例如.cshtml, .vbhtml, .ascx.

模板文件名到shape名的映射

????以下規則表示從一個模板文件名到對應shape名的映射規則:

  • (.) 和 (\) 變成 (_):例如在foo目錄下的bar.cshtml 對應的是foo_bar
  • (-) 變成兩個下劃線 (__):例如Views/Hello.World.cshtml對應的shape名稱為Hello_World,Views/Hello.World-85.cshtml 對應的是Hello_World__85

使用模板顯示Shapes

????Shape template是顯示shape的一個代碼片段,在Orchard中缺省的視圖引擎是Razor,在后面文章中我會單獨介紹Razor語法。下面示例把一個Map part顯示為圖片:

View Code <img alt="Location" border="1" src="http://maps.google.com/maps/api/staticmap?

&zoom=14

&size=256x256

&maptype=satellite&markers=color:blue|@Model.Latitude,@Model.Longitude

&sensor=false" /> ??? 這個示例顯示一個img 元素,并設定好帶參數的src 屬性,在query字符串中, @Model代表傳入到模板中的shape。因此, @Model.Latitude 代表shape的Latitude 屬性, @Model.Longitude 代表shape的Longitude屬性。


下面我們再顯示一個編輯模板,這個模板可以輸入經度和緯度值:

View Code @model Maps.Models.MapPart

<fieldset>
<legend>Map Fields</legend>

<div class="editor-label">
@Html.LabelFor(model
=> model.Latitude)
</div>
<div class="editor-field">
@Html.TextBoxFor(model
=> model.Latitude)
@Html.ValidationMessageFor(model
=> model.Latitude)
</div>

<div class="editor-label">
@Html.LabelFor(model
=> model.Longitude)
</div>
<div class="editor-field">
@Html.TextBoxFor(model
=> model.Longitude)
@Html.ValidationMessageFor(model
=> model.Longitude)
</div>

</fieldset> @Html.LabelFor 表達式生成一個shape屬性的label, @Html.TextBoxFor 生成輸入shape屬性的文本框, @Html.ValidationMessageFor 生成非法提示信息框。

生成一個shape的方法

????另一種生成并展現shape的方法時生成一個同時定義和展現shape的方法。這個方法必須標記Shape 屬性(Orchard.DisplayManagement.ShapeAttribute)。這個方法不適用模板,而是直接返回一個IHtmlString 對象,這個對象包括展現shape的標記。

????下面示例是DateTimeRelative shape,這個shape 輸入之前的日期,返回與現在日期的差隔時間:

View Code public class DateTimeShapes : IDependency
{

private readonly IClock _clock;


public DateTimeShapes(IClock clock)
{

_clock
= clock;

T
= NullLocalizer.Instance;

}


public Localizer T { get; set; }


[Shape]

public IHtmlString DateTimeRelative(HtmlHelper Html, DateTime dateTimeUtc)
{

var time
= _clock.UtcNow - dateTimeUtc;


if (time.TotalDays > 7)

return Html.DateTime(dateTimeUtc, T("'on' MMM d yyyy 'at' h:mm tt"));

if (time.TotalHours > 24)

return T.Plural("1 day ago", "{0} days ago", time.Days);

if (time.TotalMinutes > 60)

return T.Plural("1 hour ago", "{0} hours ago", time.Hours);

if (time.TotalSeconds > 60)

return T.Plural("1 minute ago", "{0} minutes ago", time.Minutes);

if (time.TotalSeconds > 10)

return T.Plural("1 second ago", "{0} seconds ago", time.Seconds);


return T("a moment ago");

}

}

參考:Accessing and rendering shapes

推薦:你可能需要的在線電子書???

我的新浪圍脖: http://t.sina.com.cn/openexpressapp?? 敏捷個人sina圍裙:http://q.t.sina.com.cn/135484??

歡迎轉載,轉載請注明:轉載自周金根 [ http://zhoujg.cnblogs.com/ ]

轉載于:https://www.cnblogs.com/zhoujg/archive/2011/03/03/1969877.html

總結

以上是生活随笔為你收集整理的Orchard: Shape展现介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产免费aa| 亚洲成人av电影 | 美女张开双腿让男人捅 | 久久99国产精品久久99 | 九九色影院 | 久热这里只有精品6 | 成人免费无码大片a毛片 | 中出在线 | 精品一区二区三区久久久 | 夜夜嗨一区二区三区 | 娇妻之欲海泛舟无弹窗笔趣阁 | 国产成人在线播放 | 日韩国产欧美一区二区三区 | 黄色1级视频 | 波多野结衣视频网站 | 糖心av | 国产精品福利一区二区三区 | 亚洲91在线 | 亚洲电影在线观看 | 久久久久国产一区二区三区 | 给我看高清的视频在线观看 | 日韩欧美在线一区二区三区 | 手机在线永久免费观看av片 | 日本精品一区二区在线观看 | 国产成人精品999在线观看 | 日韩成人一区二区三区 | 久草资源在线播放 | 国产精品成 | 爱爱精品视频 | 婷婷丁香久久 | 日韩欧美一区二区三区四区五区 | 亚洲色图校园春色 | 91情侣在线 | 久久精品色欲国产AV一区二区 | 乌克兰毛片 | 久精品视频 | 亚洲一区二区播放 | 欧美色v | av在线中文 | 日本午夜一级 | 国产精品色片 | 欧美福利电影 | 精品国产污污免费网站入口 | 全部孕妇毛片丰满孕妇孕交 | 露脸啪啪清纯大学生美女 | 少妇把腿扒开让我舔18 | 粉色视频免费 | 麻豆三级视频 | 欧美4区| 中文字幕黄色 | 欧美大尺度做爰啪啪床戏明星 | 国产黄av| 91看片在线观看 | 无码人妻精品一区二区三区在线 | 一久久 | 亚洲AV无码一区二区三区少妇 | 毛片自拍 | 国产伦理精品 | 男人激情网 | 欧美jizz19性欧美 | www三级免费| 成人欧美一区二区三区小说 | 一级黄色毛毛片 | 欧美高潮视频 | 国产福利视频导航 | 丰满大乳奶做爰ⅹxx视频 | 69久久久 | 欧美精品一区视频 | 日韩欧美精品在线视频 | 欧美精彩视频 | 欧美在线中文字幕 | 中文字幕一区二区三区免费 | 亚洲一一在线 | 91在线视频国产 | 亚洲欧美日韩精品一区 | 欧美激情在线免费观看 | 亚洲成av人片久久 | 奇米网在线观看 | 又欲又污又肉又黄短文 | 国产精品99久久久久久久 | 国产精品熟妇一区二区三区四区 | 国内精品免费视频 | 欧美午夜激情影院 | 天天操天天草 | 男人天堂网在线视频 | 国产一级18片视频 | 国产精品欧美日韩 | 在线免费观看黄色 | 99热这里只有精品在线 | 国产人成在线 | 一级女性全黄久久生活片免费 | 日韩久久网 | 亚洲性夜 | 五月婷婷激情四射 | 高h捆绑拘束调教小说 | 老司机午夜免费精品视频 | 国产爱搞 | 亚洲春色在线 | 青青草视频观看 |