Asp.net mvc 我是否应该将System.Web.Mvc导入Orchard内容部件驱动程序?

Asp.net mvc 我是否应该将System.Web.Mvc导入Orchard内容部件驱动程序?,asp.net-mvc,asp.net-mvc-4,orchardcms,Asp.net Mvc,Asp.net Mvc 4,Orchardcms,我正忙着学习Orchard文档中的一个教程,该教程介绍如何将自定义内容部分添加到用户内容类型中。它使用的视图模型声明了用于下拉列表的列表,如下所示: public IEnumerable<SubscriptionPackageRecord> Packages { get; set; } ... Packages = _userSubscriptionService.GetPackages() 我更愿意将模型的Packages属性声明为SelectList类型,并使用一个简单的单行

我正忙着学习Orchard文档中的一个教程,该教程介绍如何将自定义内容部分添加到用户内容类型中。它使用的视图模型声明了用于下拉列表的列表,如下所示:

public IEnumerable<SubscriptionPackageRecord> Packages { get; set; }
...
Packages = _userSubscriptionService.GetPackages() 

我更愿意将模型的Packages属性声明为SelectList类型,并使用一个简单的单行调用来调用
DropDownListFor
,但我怀疑在更接近业务层的类(内容部分驱动程序)中创建选择列表的实践的好处。将
System.Web.Mvc
导入驱动程序类并在那里创建和分配
SelectList
对象会是一种不好的做法吗?

部分已经绑定到Orchard,以保持一个纯业务对象,我认为您不会使它变得更加依赖。如果感觉不对劲,可以为该视图使用单独的模型?

SelectListItem是一个纯粹与UI相关的实体,在视图中创建它是正确的做法。这里,我们将包的视图模型转换为DropDownListFor方法所需的对象


将SelectListItems的创建移动到驱动程序中相当于将视图逻辑移动到控制器中。它使驱动程序对如何渲染进行假设。如果您覆盖该形状以使用HTML以外的其他技术,或者一些基于脚本的奇特UI元素,该怎么办?如果该列表有多个表示,该怎么办?

我更喜欢你的答案,而不是我的。是的。也许我应该看一个HTML助手来从标记中抽象下拉列表的创建,但是让它特定于列表的特定表示。
@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...")