partial view 以及Document type的关系

来源:互联网 发布:游戏本 知乎 编辑:程序博客网 时间:2024/06/05 18:55

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>            }        }


对应以上的代码,效果如下: