日韩性视频-久久久蜜桃-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展现介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产免费无码一区二区视频 | 久久精品av | 亚洲国产网站 | 亚洲精品国产手机 | 色爽爽一区二区三区 | 国产精品秘入口18禁麻豆免会员 | 久久国产一 | 国产精品久久久网站 | 亚洲国产精品国自产拍av | 久草福利资源在线观看 | 日韩精品亚洲一区 | 在线成人中文字幕 | 精品国产伦一区二区三区 | 亚洲图片 自拍偷拍 | 亚洲自拍成人 | 免费av中文字幕 | 葵司免费一区二区三区四区五区 | 一区二区三区四区免费观看 | 啦啦啦av | 亚洲欧洲天堂 | 黄色aaaa| 国产九九热 | 人人插人人 | 欧美激情免费视频 | 伊人久久综合影院 | 国产成人av影院 | 一级片aaa | 成人1区2区 | 丝袜 亚洲 另类 欧美 重口 | 日韩av片在线免费观看 | 成人久久精品人妻一区二区三区 | 久国久产久精永久网页 | 一级全黄裸体片 | 18成人免费观看视频 | 美女扒开腿让男人 | 亚洲色图一区二区 | 国产精品成人久久电影 | 欧美日韩激情 | 欧洲-级毛片内射 | 色一情一乱一伦 | 国产九九九九 | 日韩乱码一区二区三区 | 日韩a级一片 | 亚洲自拍第三页 | 国产精品久久久久久久午夜 | 动漫涩涩免费网站在线看 | 日本精品国产 | 亚洲最大免费视频 | 成人久久免费视频 | 亚洲在线免费观看 | 国产成人精品免高潮费视频 | 成人精品一区二区三区四区 | 特级西西444www高清大胆 | 精品国产一级片 | 免费爱爱视频网站 | 秋霞午夜 | 女儿的朋友4在线观看 | 久久久久久无码精品大片 | 欧美日韩综合视频 | 久久天天综合 | 国产精品久久综合视频 | 亚洲天堂2014 | 亚洲色图在线视频 | 欧美射图 | 日本一区二区三区在线观看 | 我们2018在线观看免费版高清 | 天天做夜夜爽 | 日韩精品在线免费观看 | 国产免费av片在线 | 超碰2021| 久久官网 | 五月天国产精品 | 亚洲社区在线观看 | 一区二区三区免费看 | 91av国产精品 | 一本久道在线 | 亚洲一区二区不卡视频 | 亚洲精品综合 | 久久九九国产视频 | 成人aaaaa| 中日韩精品视频 | 淫僧荡尼巨乳(h)小说 | 精品123区| 男女一级片 | 黄色永久视频 | av在线不卡网站 | 久久久久久国产精品无码 | 黄色三级在线 | 日本va欧美va精品发布 | 精品国产乱码久久久久久牛牛 | 欧美大片在线观看 | 什么网站可以看毛片 | 国产伦精品一区二区三区四区 | 亚洲激情成人网 | 亚洲小说区图片区 | 亚洲成人黄色影院 | 久久老司机 | 男女啪啪免费网站 | 谁有免费的黄色网址 |