我有一个下拉列表,代表与文档相关的各种“属性”字段。例如,一个文档可能有一个标签字段,它需要一个文本框来输入您的标签。或者它可能有一个位置字段,并且会有一个用户可以选择的各种位置类型的预填充下拉列表。或者它可能是一个截止日期字段,我们有一个用于选择日期的自定义日期选择器。
我的问题:我想在选择适当的属性字段时在控制器动作中声明一个HTMLHELPER。我将切换 Attribute.Type 是什么,并且根据类型,我将在我的视图模型中返回适当的 html 以在视图中呈现。如果我这样做,我可以对我的 switch 语句进行单元测试。
我正在阅读所有在控制器中声明 HtmlHelper 是一个坏主意。我能理解这种情绪——有没有更好的方法可以做到这一点?我想尽可能避免在我的视图中使用逻辑,因为我根本无法对其进行单元测试。
我看到的另一种方法是在视图模型中传递 Attribute.Type,并在视图上执行切换逻辑以确定调用哪个 HtmlHelper 方法。这是要走的路吗?提前致谢。
编辑:我说的是想在代码隐藏中做这样的事情。我的单元测试会针对 viewModel.FieldHtml 断言。我听到的是我应该把它放在另一个类中并让控制器调用它。但这就是它在控制器中的样子。这只是伪代码,所以它并不完美,但它为我所问的内容提供了上下文。
public ActionResult GetValueInput(Guid attributeFieldUid)
{
//you have to pass some stuff into the constructor but essentially this
HtmlHelper html = new HtmlHelper();
AttributeField field = GetAttributeFieldFromDb(attributeFieldUid);
AttributeViewModel viewModel = new AttributeViewModel();
switch(field.type)
{
case Dropdown:
viewModel.FieldHtml = html.DropDownList();
break;
case Text:
viewModel.FieldHtml = html.TextBox();
break;
case Date:
// our own extension method
viewModel.FieldHtml = html.OurDatePicker();
break;
}
}
我最初看到的另一个选项基本上是在剃刀视图上执行此 switch 语句。但我想我喜欢在控制器最常调用的单独类中执行此操作的想法。
这真的是一个设计问题——我在问什么方法来实现这个最有意义?