【问题标题】:ASP.Net MVC 2: Using a viewmodel destroys my model bindingASP.Net MVC 2:使用视图模型会破坏我的模型绑定
【发布时间】: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,并且绑定失败。

我可以想到几种解决方法:

  1. 编写专门的自定义模型绑定器
  2. 将整个该死的表单放入它自己的类型编辑器中,这样它就可以在不知道它是一个属性的情况下获得item 模型
  3. 使用ViewData 字典终止视图模型并破解下拉菜单
  4. 使用HtmlHelpers 退出并手写整个表单
  5. 编写我自己的HtmlHelper 扩展,将一个兰巴和一个模型对象作为参数。
  6. 将每个标签/字段分组放入单独的编辑器模板中。

所有这些都感觉像是矫枉过正或草率。 Viewmodels 似乎是一种干净、有用的方法。使用它们是否意味着我必须在其他领域马虎,或者在相当大的框架块上复制微小的变化?在过去的三个月里,我自学了 C#(一个平面设计师试图在没有 CS 背景的情况下弄清楚静态类型到底是什么,这看起来很有趣)。我孤立地工作;没有人可以学习最佳实践。我觉得如果我不学习其中的一些,我最终会变成一个无法维护的粪堆。所以,你的意见是值得赞赏的。

【问题讨论】:

    标签: c# asp.net-mvc-2


    【解决方案1】:

    叹息。再用几个小时的谷歌搜索和在黑暗中拍摄几张照片,似乎有一种令人难以置信的简单方法可以做到这一点,使用 Bind 属性:

    [HttpPost]
    public ActionResult([Bind(Prefix="item")] item)
    {
        //item's complex types populate correctly
    }
    

    该属性似乎足够聪明,可以处理复杂的类型。

    我将把这个作为对我自己无知的致敬,并希望其他一些倒霉的 n00b 能比我更快地找到答案。

    【讨论】:

      【解决方案2】:

      Daniel,首先我要说的是,我要赞扬你的努力,并在 .NET、C# 和 ASP.NET MVC 方面一举两得。好的,所以你很沮丧,我对此表示赞同。这种情况时不时发生在我们所有人身上。

      我应该让你知道,我不是 ASP.NET MVC (Problems with ASP.NET MVC Framework Design) 的粉丝(实际上一点也不),所以我无法为你的问题提供一个可行的解决方案.但我希望你看到你所处的情况:

      你在一个迷宫中,你在某个地方转错了方向,你会更深入地进入迷宫,但你不会找到出路。所以你需要做的是退回到那个错误的转弯,看看是否有另一条路线。因此,从您所在的位置开始,问自己,“为什么”为您所做的每一步/更改,并一次备份一个步骤,询问为什么。那有意义吗?你最终会到达一个地步,你有其他替代方法来解决相同的(原始)问题。

      【讨论】:

      • -1。对解决问题没有帮助,充满了宣扬和关注 ASP.Net MVC 的负面而不是正面。
      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多