原文链接:http://docs.nopcommerce.com/pages/viewpage.action?pageId=1442499
翻译 by:yersans,如有不妥,敬请指正,博主邮箱:zhanglei0591@qq.com。转载请注明出处。
本教程讲解如何在已发布的nopCommerce 源码中添加一个属性到Affiliate 实体。
数据模型
实体用两个类将记录映射到数据表中,第一个类定义所需的属性、字段和方法。
文件位置: [Project Root]LibrariesNop.CoreDomainAffiliatesAffiliate.cs
程序集:Nop.Core
解决方案位置:Nop.Core.Domain.Affiliates.Affilate.cs
第二个类将定义的属性映射到各自对应的SQL列上。这个类同样负责映射不同SQL表之间的关系。
文件位置:[Project Root]LibrariesNop.DataMappingAffiliatesAffiliateMap.cs
程序集:Nop.Data
解决方案位置: Nop.Data.Mapping.Affiliates.AffiliateMap.cs
把下面的属性添加到Affiliate 类中
// 数据表对象(如Affiliate.cs)的实例成员必须用virtual关键字修饰
// 数据访问框架要求使用Virtual关键字,以便能实现更多复杂的功能,如延迟加载等。
public virtual string AffiliateWebSite { get; set; }
将下面的代码添加到AffiliateMap 类的构造函数中
// 这段代码把我们上面创建的属性映射为数据库中的一列
// 它在 Affiliate 表中创建一个可空的最大长度为255个字符的nvchar类型字段
this.Property(m => m.AffiliateWebSite).HasMaxLength(255).IsOptional();
现在,运行程序,重新安装数据库,检查相应的列是否已被正确创建。
(附言:经博主本人测试,删除项目数据库和 opCommercePresentationNop.WebApp_DataSettings.txt文件,清理并重新生成整个项目,然后运行项目,会提示用户重新安装,安装成功后,数据库相关字段即成功更新。你也可以使用自定义的SQL脚本更新数据库。参见文末故障排除部分的建议。)
表现层模型
表现层模型用来把信息从控制器传递到视图(了解更多请访问asp.net/mvc)。模型还有一个用途:定义要求。
我们的数据库配置只允许AffiliateWebSite字段存储255个字符以内大小的变量。如果我们尝试存储一个300个字符大小的变量,程序就会出错(或者会截短你输入的文本)。我们应当尽最大可能保护用户避免失败,视图模型有助于强制要求这些条件,例如字符串的最大长度。
文件位置:[Project Root]PresentationNop.WebAdministrationModelsAffiliatesAffiliateModel.cs
程序集:Nop.Admin
解决方案位置:Nop.Admin.Models.Affiliates.AffiliateModel.cs
验证类用来验证模型类中存储的数据(例如,非空字段,最大长度,和取值范围)。
文件位置:[Project Root]PresentationNop.WebAdministrationValidatorsAffiliatesAffiliateValidator.cs
程序集: Nop.Admin
解决方案位置:Nop.Admin.Validators.Affiliates.AffiliateValidator.cs
添加属性到视图模型
// NopResourceDisplayName 提供了本地化时所用的关键字,
// 我们的博客将会提供更多关于本地化的信息,请密切关注。
[NopResourceDisplayName("Admin.Affiliates.Fields.AffiliateWebSite")]
public string AffiliateWebSite { get; set; }
条件要求相关代码会被加入到对应validator类的构造函数中
//我想这句代码本身就能说明它的作用吧
RuleFor(m => m.AffiliateWebSite).Length(0, 255);
视图
文件位置:[Project Root]PresentationNop.WebAdministrationViewsAffiliates _CreateOrUpdate.cshtml
程序集:Nop.Admin
解决方案位置:Nop.Admin.Views.Affiliates._CreateOrUpdate.cshtml
视图包含用来显示模型数据的html代码。请把这些html代码放在“活动的”区域内。
<tr>
<td class="adminTitle">
@Html.NopLabelFor(model => model.AffiliateWebSite):
</td>
<td class="adminData">
@Html.EditorFor(model => model.AffiliateWebSite)
@Html.ValidationMessageFor(model => model.Active)
</td>
</tr>
控制器
本例中,控制器负责将领域数据模型映射为视图模型,反之亦然。我选择affiliate模型的原因是因为它简单。我希望本篇关于nopCommerce 的介绍尽可能简单。
文件位置:[Project Root]PresentationNop.WebAdministrationControllerssAffiliateController.cs
程序集:Nop.Admin
解决方案位置:Nop.Admin.Controllers.AffiliateController.cs
我们将对AffiliateController 做三个更新
- 数据模型->视图模型
- 创建视图模型->数据模型
- 编辑视图模型->数据模型
通常我会在代码之后写一些测试,以确认模型映射正常工作,但是为了保持本文简单我把这一步留到测试项目时再做。
在PrepareAffiliateModel的model.Active = affiliate.Active下面添加以下代码
// 数据模型->创建/编辑 视图模型
model.AffiliateWebSite = affiliate.AffiliateWebSite;
在 public ActionResult Create(AffiliateModel model, bool continueEditing的affiliate.Active = model.Active下面添加以下代码
// 创建视图模型 -> 数据模型
affiliate.AffiliateWebSite = model.AffiliateWebSite;
在public ActionResult Edit(AffiliateModel model, bool continueEditing)做类似的修改
// 编辑视图模型 -> 数据模型
affiliate.AffiliateWebSite = model.AffiliateWebSite;
数据库
如果你是在扩展已安装的程序(包括已创建的数据库),那么你必须手动添加对应的列("AffiliateWebSite")到相应的表("Affiliate")中。
故障排除
- 重新创建数据库。用你自定义的SQL脚本或者nopCommerce 皆可。
- 更新数据库结构时要暂停服务器。
- 请把细节发布到我们的论坛以寻求帮助。