如何使用数据库查询在 ASP.NET MVC 5 中创建复杂的 EditorTemplate?

How create a complex EditorTemplate in ASP.NET MVC 5 with db query?

我想从列表中创建一个更复杂的 EditorTemplate 到 select 客户。

我知道 DropDownListFor,但我想向客户展示卡片 图片和一些数据不仅仅是常规的 select 列表。

我想做的事情:

为客户 select 创建一个 EditorTemplate,例如...在任何 POCO Class

public class X{

    [Key] int Id {get;set;}

    [UIHint("CustomerSelector")] int Custumer_Id {get;set;}

}

并且“CustomerSelector”编辑器模板能够查询所有客户并将他们显示到富豪榜中。

问题是什么:

如何创建此 EditorTemplate 而不会弄乱 MVC 模式或在每个控制器中重复代码?

不幸的是,没有真正好的方法来处理这样的事情。您是正确的,在视图中进行数据库访问是不正确的。这不仅违反了 MVC,而且还需要在视图中创建一个额外的上下文实例,而实际上每个请求应该只有一个实例。

如您所述,另一种方法是在控制器中执行查询,然后将其传递到您的视图中。老实说,这可能是你最好的坏选择。

我看到的另一种选择是使用子操作。子操作允许您将查询用户和传递给视图的逻辑限制在一个地方。缺点是您必须手动处理字段命名,因为子操作视图的呈现将超出您正在构建的表单的范围。换句话说,您必须执行以下操作:

@Html.Action("CustomerSelect", new { fieldName = "Customer_Id" })

这也不是很理想,因为现在您已经有了一个必须跟踪的字符串,而且您必须小心实际提供正确的名称。例如,如果这是一个项目集合,那么您实际上需要传递类似 "MyCollection[" + i.ToString() + "].Customer_Id" 的内容。你可以看到这很快就开始变得混乱了。仅出于这个原因,我几乎不会将其作为可能的解决方案。

最后一个选择是使用 HtmlHelper 扩展。这与编辑器模板存在相同的问题,因为您将不得不新建一个上下文实例,但至少在不在 Razor 视图内完成方面更好。