【问题标题】:What is the right approach for a View with many forms and viewmodels in MVC?对于在 MVC 中具有许多表单和视图模型的视图,正确的方法是什么?
【发布时间】:2014-08-29 06:51:04
【问题描述】:

我有一个视图来创建一个对象,这个对象可以是三种类型。所以我决定创建一个带有 3 个选项卡的选项卡面板,每个选项卡代表这个对象的一种类型。

用户必须选择他们将填写数据的选项卡并按提交。顺便说一句,每个选项卡都有一个 FORM 和一个提交。

到目前为止,1 个视图和 3 个表单。

我想知道是否有更好的方法来做到这一点。使用渲染动作,partials,只有一个 viewmodel,很多 viewmodel。

我的最后一次尝试是使用具有所有可能性的大视图模型,并填充了一个用于确定类型/选项卡面板的隐藏字段。当用户提交时,我只得到该对象类型将使用并保存在数据库中的字段。

Pro:只有一个视图模型,只有一个控制器。如果模型状态有错误,我可以毫不费力地在视图中显示结果(使用 html validationmessagefor)。 Razor 绑定和 Razor 助手。 缺点:我不能在所有字段中使用数据注释,因为某些字段需要一个类型而不是另一个类型,并且它们具有相同的名称。如果一个表单的字段发生变化,另一个选项卡/表单中的同名字段也会发生变化。该对象有一些属性必须根据类型选择进行更改,但其他属性是相同的。那些显示更改了他的值,并且为每个表单显示了验证消息。 这是最好的方法

编辑

我正在考虑创建一个视图模型作为 3 个视图模型的容器。所以字段将被分开,对于每个“提交”,我将使用三个视图模型之一。

这是个好方法吗?

【问题讨论】:

  • MVC 使用策略模式,你可以很好地利用它(参考:codeproject.com/Articles/42830/…)你的视图上有多个表单没有问题,如果你可以为每个表单指定不同的控制器适合您的架构。
  • 是的,这是一个很好的方法。确保您提供正确的命名,并且您必须了解模型绑定才能使用它

标签: c# asp.net-mvc razor asp.net-mvc-5 viewmodel


【解决方案1】:

无论您使用子动作、局部动作还是将所有内容都放在一个视图中都没有区别。特别是,一旦您发布了,无论您是使用子操作还是部分操作来呈现表单,都是无关紧要的。您不能发布到子操作。

首先,我建议您创建一个包装视图模型来保存所有特定于表单的视图模型,并在页面上为每个表单使用一个视图模型,并且不要忘记实例化这些视图模型(主视图模型是个好地方):

public class MainViewModel
{
    public MainViewModel()
    {
        Form1 = new Form1ViewModel();
        Form2 = new Form2ViewModel();
        ...
    }

    public Form1ViewModel Form1 { get; set; }
    public Form2ViewModel Form2 { get; set; }
    ...
}

接下来,由于您实际上为每个表单使用了单独的提交按钮,这使得这更加容易,因为您可以为每个提交按钮命名,并使用该名称来确定用户提交的表单:

<button type="submit" name="_form1Submit">Submit</button>

然后,在你的行动中:

if (Request.Unvalidated["_form1Submit"] != null)
{
    // form 1 was submitted
}

最后,默认情况下,modelbinder 将验证您的整个视图模型 (MainViewModel),并且您将在其他表单上未填写的任何字段上收到错误。但是,您可以使用TryUpdateModel 对您想要的任何部分重新运行模型验证:

if (Request.Unvalidated["_form1Submit"] != null)
{
    TryUpdateModel(model.Form1);
    if (ModelState.IsValid)
    {
        // do something interesting
    }
}

【讨论】:

  • 噢,我的头爆炸了,现在我必须从天花板上取下我的大脑。它比我想的要简单。非常感谢克里斯,我会在这里尝试,如果它运作良好,我确认你的回答。顺便说一句,这是最好的方法,对吧?我喜欢用最好的方式做事,永远。
  • “最佳”是主观的。也许“最好”的方式就是不要一开始就试图将所有这些表单都放在一个页面上。只有您可以根据您的业务需求确定适合您的应用程序的内容。
猜你喜欢
  • 2018-05-30
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
相关资源
最近更新 更多