我想这是一个关于框架如何愉快地完成你所需要的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.说得通.我告诉我的Update视图,itemViewModel而不是绑定工作.
哦等等,不,不.因为我有嵌套使用编辑器的对象.它们是强类型的,并且它们不知道它们接收的模型实际上是视图模型的属性.所以他们仍然吐出来Address.City而不是item.Address.City绑定失败.
我可以想到几个解决方法:
item不知道它是属性的情况下获得模型ViewData字典破解下拉列表HtmlHelpers并手写整个表单HtmlHelper扩展,将lamba 和模型对象作为参数.所有这些感觉都像是矫枉过正或邋.. Viewmodels似乎是一个干净,有用的方法.使用它们是否意味着我必须在其他方面马虎,或者在框架的相当大的块上重现微小的变化?在过去的三个月里,我自学C#(一位平面设计师试图弄清楚什么是静态打字,没有CS背景可能很有趣).我孤立地工作; 没有人可以从中学习最佳实践.我觉得如果我不学习其中的一些,我最终会得到一个难以维护的粪堆.所以,您的意见表示赞赏.
叹.几个小时的谷歌搜索和黑暗中的一些镜头,似乎有一个令人难以置信的直截了当的方式,使用Bind属性:
[HttpPost]
public ActionResult([Bind(Prefix="item")] item)
{
    //item's complex types populate correctly
}
该属性似乎足够智能,可以进入复杂类型.
我将这留下来作为对我自己的无知的致敬,并希望其他一些倒霉的n00b会比我更快找到答案.
| 归档时间: | 
 | 
| 查看次数: | 829 次 | 
| 最近记录: |