我正忙着在Orchard文档中关注向 User 内容类型添加自定义内容部分的教程。它使用视图模型声明用于下拉列表的列表,如下所示:
public IEnumerable<SubscriptionPackageRecord> Packages { get; set; }
...
Packages = _userSubscriptionService.GetPackages()
其中GetPackages
为IEnumerable<SubscriptionPackageRecord> GetPackages()
。然后,在编辑器模板中,他们使用一些有点笨重的代码来填充下拉列表:
@Html.DropDownListFor(model => model.PackageId,
Model.Packages.Select(s => new SelectListItem {
Selected = s.Id == Model.PackageId,
Text = s.Name,
Value = s.Id
}),
"Choose a package...")
我更希望将模型的Packages属性声明为SelectList类型,并使用对DropDownListFor
的简单一行调用,但我怀疑在更接近业务层类中创建选择列表的实践的好处,内容部分驱动程序。将System.Web.Mvc
导入驱动程序类并在那里创建并分配SelectList
对象是不是不好的做法?
答案 0 :(得分:0)
零件已经与Orchard联系在一起,因此只要保留一个纯粹的业务对象,我认为你不再依赖它。如果感觉不对,可能只是为这个视图选择一个单独的模型?
答案 1 :(得分:0)
SelectListItem是纯粹与UI相关的实体,在视图中创建它是正确的做法。在这里,我们将包的视图模型转换为DropDownListFor方法所需的对象。
将SelectListItems的创建移动到驱动程序中等同于将视图逻辑移动到控制器中。它使驱动程序对如何呈现它进行假设。如果您覆盖该形状以使用除HTML之外的其他技术或某些基于脚本的基本UI元素,该怎么办?如果该列表有多个表示,该怎么办?