partial view
主要有两类,第一纯ASP.NETMVC的partialView概念,基于Razor引擎的,对应目录Partials,@Html.Partial;第二是macroPartial View对应目录MacroPartials,@Umbraco.RenderMacro.
<h2>Let's render a macro (a "partial view"in MVC)</h2>
@Html.Partial("ChildContent")
在我们的Partial目录下有ChildContent.cshtml文件,内容如下:
@inherits RenderViewPage
@using Umbraco.Cms.Web;
<div class="roundedbox">
// Returns the Json value as a dynamic object.
// http://msdn.microsoft.com/en-us/library/system.json.jsonvalue.asdynamic(v=vs.110).aspx
<h2>Child contentretrieved from the Model</h2>
@foreach (var item in Model.ChildContent())
{
var childName =item.AsDynamic().Name ?? "(No name yet)";
<p>Child node name:<b><a href="@item.NiceUrl()">@childName</a></b>,of type <em>@item.ContentType.Name</em>.</p>
}
<h2>Child contentretrieved from the DynamicModel</h2>
@foreach (var item in DynamicModel.Children)
{
var childName = item.Name ??"(No name yet)";
<p>Child node name:<b><a href="@item.Url">@childName</a></b>, oftype <em>@item.ContentType.Name</em>.</p>
}
</div>
从上面的代码可以看出DynamicModel和Model(staticModel)的关系,Model可以做到的,dynamicModel一定可以:
Model |
Dynamic model |
var childName = item.AsDynamic().Name ?? "(No name yet)";
|
var childName = item.Name ?? "(No name yet)";
|
="@item.NiceUrl()" |
="@item.Url" |
再看一个Partialview: @Umbraco.RenderMacro("bookList"),物理文件没找到:
代码开发的?Macros-BookList?
@inherits PartialViewMacroPage
@using Umbraco.Cms.Web
@using Umbraco.Cms.Web.Macros
@using Umbraco.Framework
@foreach (var item in DynamicModel.Children)
{
var childName = item.Name ??"(No name yet)";
<divclass="product">
<h3><ahref="@item.Url">@childName</a></h3>
<ahref="@item.Url"><img src="@Umbraco.GetMediaUrl(item.Id,"image", 100)" alt="@childName" /></a>
<p>@(((string)item.AsDynamic().BodyText).StripHtml().Truncate(100))<a href="@item.Url">Read more</a></p>
</div>
}
PartialViewMacroPage从上面的代码来看,和Razorview看起来内容差不多Umbraco.GetMediaUrl
Razor Partial View
@{
var Homepage = @DynamicModel;
while(Homepage.ContentType.Alias != "homePage")
{
Homepage =Homepage.Parent; //正确定位HomePage,逐层递归到最Home的URL
}
}
<ul>--- 水平方向
<li><ahref="@Homepage.Url">Home</a></li>
@foreach (var item inHomepage.Children)
{
if (@item.CurrentTemplate!= null)
{
var childName =item.Name ?? "(No name yet)";
<li><ahref="@item.Url">@childName </a></li>
}
}
</ul>
如何使用CSS
@inherits RenderViewPage
@using System.Web.Mvc
@using Umbraco.Cms.Web;
@{
Layout ="defaultSite.cshtml";
ViewBag.Title =DynamicModel.Name;
}
@section Stylesheets
{
<linkhref="@Url.Content("~/Content/Styles/Faqs.css")"rel="stylesheet" type="text/css" />
}
什么是Documenttype和Contenttype?
以这个FAQ来看,首先FAQ是DocumentType,并且有自己的Template(View)的方式,同时允许FAQcategory作为FAQ的下属(层次关系建立)
同样看FAQcategory,没有Defaulttemplate,也就是纯粹是datamodel的类定义部分,不带有view,同时允许FAQquestion作为下属属性,相当于
FAQ->List<FAQCategory>; FAQCategory->List<FAQQuestion>
@foreach (var f in DynamicModel.Children)
{
if (f.ContentType.Alias== "FaqCategory")
{
<liclass="category">@Html.Raw(f.BodyText)
<ul>
@foreach (varq in f.Children)
{
if(q.ContentType.Alias == "FaqQuestion")
{
<liclass="question">
@MvcHtmlString.Create(q.QuestionText)
<span class="answer">@MvcHtmlString.Create(q.BodyText)</span></li>
}
}
</ul>
</li>
}
else if (f.ContentType.Alias == "FaqQuestion") //直接是Question?
{
<liclass="question">
@MvcHtmlString.Create(f.QuestionText)
<spanclass="answer">@MvcHtmlString.Create(f.BodyText)</span></li>
}
}
对应以上的代码,效果如下: