【发布时间】:2011-01-28 01:26:46
【问题描述】:
我想这是一个关于框架如何愉快地完成你需要的 95% 的故事,但随后对最后的 5% 不以为然;通知您,如果您想参加非标准的malarky,那是您自己的事,非常感谢您,如果您决定要重新做它擅长的事情,它就会在这里。一般来说,这最后的 5% 不可避免地会包含某个版本的必备功能。
我有一个更新数据对象的强类型视图。我使用了惯用的 MVC2 助手,例如Html.TextBoxFor(model = > model.Name)。我为嵌套对象使用了编辑器模板。 (我的后端是 Mongo 文档的集合,所以需要表示复杂的类型)。
然后我需要一个下拉菜单。事实证明,下拉菜单有点挑剔。没问题,我会做一个viewmodel,而不是直接传入item:
class itemViewModel
{
...
public Item item { get; set; }
public IEnumerable<SelectListItem> dropdown { get; set; }
}
public ActionResult()
{
return View("Update", new itemViewModel(item, dropdown))
}
... 工作正常,下拉列表填充。但!我的观点需要更新:
Html.TextBoxFor(model => model.Name) ->
Html.TextBoxFor(model => model.item.Name)
很好,问题解决了。糟糕,现在我的模型绑定不起作用。我调试并查看Request.Form 值:哦。 item.Name 而不是 Name。说得通。我告诉我的更新视图期待itemViewModel,并且绑定有效。
哦,等等,不,它没有。因为我有使用编辑器的嵌套对象。他们是强类型的,他们不知道他们接收的模型实际上是视图模型的属性。所以他们仍然吐出Address.City而不是item.Address.City,并且绑定失败。
我可以想到几种解决方法:
- 编写专门的自定义模型绑定器
- 将整个该死的表单放入它自己的类型编辑器中,这样它就可以在不知道它是一个属性的情况下获得
item模型 - 使用
ViewData字典终止视图模型并破解下拉菜单 - 使用
HtmlHelpers退出并手写整个表单 - 编写我自己的
HtmlHelper扩展,将一个兰巴和一个模型对象作为参数。 - 将每个标签/字段分组放入单独的编辑器模板中。
所有这些都感觉像是矫枉过正或草率。 Viewmodels 似乎是一种干净、有用的方法。使用它们是否意味着我必须在其他领域马虎,或者在相当大的框架块上复制微小的变化?在过去的三个月里,我自学了 C#(一个平面设计师试图在没有 CS 背景的情况下弄清楚静态类型到底是什么,这看起来很有趣)。我孤立地工作;没有人可以学习最佳实践。我觉得如果我不学习其中的一些,我最终会变成一个无法维护的粪堆。所以,你的意见是值得赞赏的。
【问题讨论】:
标签: c# asp.net-mvc-2