繁体   English   中英

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

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

我想创建一个更复杂的EditorTemplate来从列表中选择一个客户。

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

我想做什么:

创建一个EditorTemplate供客户选择,例如......在任何POCO类中

public class X{

    [Key] int Id {get;set;}

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

}

并且“ CustomerSelector ”编辑器模板能够查询所有客户端并将它们显示在一个丰富的列表中。

客户名单

问题是什么:

  • 从视图中添加查询逻辑不是一个好主意。 这是针对MVC模式的。
  • 查询每个控制器中的客户列表并将其作为参数传递给EditorTemplate并不是非常模块化的。

如何创建这个EditorTemplate而不会搞乱MVC模式,也不会在每个控制器中重复代码?

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

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

我看到的另一个选择是使用儿童动作。 子操作允许您限制查询用户和仅在一个位置传递到视图的逻辑。 缺点是您必须手动处理字段命名,因为子操作视图的呈现将超出您正在构建的表单的范围。 换句话说,你必须做的事情如下:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM