【问题标题】:MVC, View Model and [Required]MVC、视图模型和[必需]
【发布时间】:2016-02-02 18:48:40
【问题描述】:

我有一个用于多个表单的单一视图模型的设置,我的验证导致了我的问题。

问题 1 我可以使用单视图模型并仅验证表单中使用的字段吗?

我有一个视图模型

    public class KundeOrdreVM : IPanelVM
    {
        public string PhoneNumber { get; set; }
        public string ItemEAN{ get; set; }
    }

在我看来,我有两种形式(此示例的代码已简化)

<form action="/CreatePhone" method="post" novalidate="novalidate">                      
    @Html.EditorFor(model => model.PhoneNumber)
    <input type="submit" value="Create Phone">
</form>

表格2:

<form action="/CreateItem" method="post" novalidate="novalidate">                       
    @Html.EditorFor(model => model.ItemEAN)
    <input type="submit" value="Create Item">
</form>

每个表单都使用来自共享 ViewModel 的单个字段。

我的问题是我想将这两个字段都设为 [必填],但前提是用户发布了使用该字段的表单。

有什么方法可以在重用同一个 ViewModel 的同时完成这项工作?

问题 2 如果我必须使用多个 ViewModel 作为每个表单的输入,是否有一个很好的设计实践指南来说明如何在单个 View 中使用多个 ViewModel?

我不喜欢为我页面上的每个表单制作大量的@Html.RenderPartial。表单紧密相连。

【问题讨论】:

    标签: forms validation mvvm asp.net-mvc-5


    【解决方案1】:

    当您需要不同要求的表单时,就是将 ViewModel 分开。通常 ViewModel 与视图具有 1:1 的关系,而 1:n 的关系非常少见。

    其中一个原因是,你们两个视图中的一个可能会在未来发生需求变化。如果您将此新字段添加到 ViewModel,这也会影响使用相同 ViewModel 的其他视图。

    最初这可能看起来需要更多的工作,但后来在需求发生变化时应用更改会更容易。

    仅当 ViewModel 执行完全相同的操作并且必须将一项更改的要求反映到所有其他视图时,才能在多个视图中重用 ViewModel,例如 LoginViewModel 您有不同的视图要登录,例如导航栏中的登录字段,当用户登录时出现在任何地方,并且在尝试访问受保护的页面时用户被重定向到的显式页面。

    【讨论】:

    • 我担心情况就是这样。那么,我们如何处理我的页面上有 5 个按钮的情况,每个按钮都是一个单独的表单,每个表单都有一个输入字段。我是否创建 5 个 ViewModel,然后创建一个 ParentViewModel 来保存 5 个?
    • 不确定我是否理解 ParentViewModel 如何适应这一点。是 PhoneNumber/ItemEAN 还是为什么您需要一一添加它们而不是(通过单独的按钮/表单)而不是一个单一的表单。是为了捕捉用户的意图(即在使用事件溯源时)?从上面的代码看来,每个按钮都与一个动作相关联,因此您只希望该动作有一个视图模型。在这种情况下,ParentViewModel 的目的是什么?
    • 情况是我有一个订单控制器和一个处理订单功能的页面。如果您有电话号码,则可以在该页面上创建新订单,或者如果您有商品 EAN,则可以将商品添加到列表中。两个按钮彼此相邻,使用它们的顺序无关紧要。我在我的控制器上使用了 1 个 ViewModel、2 个表单、2 个按钮、2 个操作来完成此操作。这导致了我这个问题,我不确定适合这种情况的最佳设计
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 2010-10-03
    • 2011-10-24
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多