在《Orchard中的一些名词》一文中先容过字段( Field)的观念,它是一种轻量级的内容部件,凡是只有一个字段,可以是一个文本输入框,或是一个日期选择框。我们可以把它领略为一种输入控件,可能称为字段范例。
再往返首一下《Orchard中的内容打点》中的先容的一些观念,在Orchard中的任何数据都可以把它领略为内容(Content)。页面是内容、博客是内容、文章也是内容。整个网站就是由这些差异范例的内容项(Content Item)组成的。对这些差异内容的范例界说就是内容范例(Content Type)。而内容范例则是通过若干个差异的内容部件(Content Part)构成。其实对付界说一些简朴的内容范例,可能说后续无巨大处理惩罚要求的内容范例时,我们也不必然非得去建设内容部件,而完全可以用一些现有的内容部件在加上若干字段(Field)就可以了。
字段(Field)和部件(Part)的区别在于,字段是不消单独去建设表来存储数据的,而是通过Orchard框架的成果将其以xml的形式存储到Orchard_Framework_ContentItemRecord表的Data字段中,而Part则需要建设相应的表去存储这些记录。这种存储上的差别就抉择了,字段形式合用于简朴场景,如只是纯真显示一个单一实体;而部件方法合用于后续有较巨大的逻辑处理惩罚的场景,如存在一对多、多的多干系等。更进一步的来说,一个部件可以领略为一个完整成果的业务实体,而一个字段只是业务实体上的一个属性。下面我们就通过一个示例来先容在Orchard中如何界说字段范例。
方针
我需要界说一个勾当范例(Event),包罗标题,时间,所在等。假如用Part的做法,我们虽然可以把时间和所在加在一起做成勾当部件。假如要用字段的形式来做,我们就可以添加一个Route部件,加上两个文本字段(TextField)即可。文本字段是Orchard自带的字段范例,成果就是一个简朴文本输入框。其实字段范例还可以做的越发友好些,好比:输入时间的时候可以弹出一个日期选择控件,输入所在的时候可以选择地址都市。关于日期时间的字段范例Orchard应用商店已经有了,我们可以去安装一个,在Gallery中搜索DateTimeField即可。此刻我们需要建设一个所在字段范例(LocaleField),包罗一个都市选择和一个所在输入。
建设模块
建设一个新的字段范例其实和建设一个模块一样,我们也可以用呼吁行东西首先建设一个代码模板。输入:codegen module MyCompany.LocaleField,运行乐成后在Orchard办理方案的Modules目次下就会多出一个MyCompany.LocaleField的项目了。
成立字段模子
我们可以在此项目中添加一个Fields文件夹,并在该目次中添加一个LocaleField.cs文件,代码如下:
LocaleField.csusing System;
using Orchard.ContentManagement;
using Orchard.ContentManagement.FieldStorage;
namespace MyCompany.LocaleField.Fields
{
/// <summary>
/// 自界说的字段需要担任ContentField类
/// Storage相当于是在ContentField中获取或配置值
/// </summary>
public class LocaleField : ContentField
{
public string Locale
{
get
{
var value = Storage.Get<string>();
return value;
}
set
{
Storage.Set(value == null ? String.Empty : value);
}
}
}
一个字段范例需要被定为一个类,而且需要担任于ContentField,这样我们就可以操作字段范例的一些现有成果,好比数据存储。字段范例的数据都是以字符串的形式存储到数据库中的,我们通过界说这个类就可以将字段数据转换成我们想要的范例好比,日期范例,数字范例等。字段数据我们不消建设相应的表去存储,Orchard框架会替我们完成这项事情。这些字段数据,将以xml的形式存储到Orchard_Framework_ContentItemRecord表的Data字段中,如:
成立视图模子
由于一个所在字段是由都市和地点构成,所以本例我们还需要成立一个视图模子来作为视图的Model,而不是直接用LocaleField作为视图的Model。固然这步事情不必然是必需的,可是成立一个视图模子却是一个好的习惯,这样可以使我们的代码看起来更清晰更易懂。在此项目中添加一个ViewModels目次,并在该目次下添加一个LocaleFieldViewModel.cs文件,输入以下代码:
LocaleFieldViewModel.csusing System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyCompany.LocaleField.ViewModels
{
public class LocaleFieldViewModel
{
public string Name { get; set; }
public string City { get; set; }
public string Address { get; set; }
/// <summary>
/// 作为示例这里就只简朴结构一些都市的数据
/// 假如要做成产物,虽然这部门需要处理惩罚的更好些
/// </summary>
public SelectList CityList
{
get
{
var lst = new List<SelectListItem>();
lst.Add(new SelectListItem { Text = "北京", Value = "北京" });
lst.Add(new SelectListItem { Text = "上海", Value = "上海" });
lst.Add(new SelectListItem { Text = "天津", Value = "天津" });
lst.Add(new SelectListItem { Text = "重庆", Value = "重庆" });
lst.Add(new SelectListItem { Text = "武汉", Value = "武汉" });
return new SelectList(lst, "Value", "Text", this.City);
}
}
}
写驱动器