在MVC中,有许多表单和视图模型的视图的正确方法是什么?

本文关键字:视图 模型 方法 是什么 MVC 表单 许多 | 更新日期: 2023-09-27 18:12:02

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

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

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

我想知道是否有更好的方法来做这件事。使用渲染动作,局部,只有一个视图模型,很多视图模型。

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

Pro:只有一个视图模型,只有一个控制器。如果模型状态有错误,我可以毫不费力地在视图中显示结果(使用html validationmessagefor)。剃刀捆绑和剃刀帮助。缺点:我不能在所有字段中使用数据注释,因为有些字段是类型所必需的,而另一些字段则不是,而且它们具有相同的名称。如果一个表单的字段被更改,另一个具有相同名称的选项卡/表单中的字段也将被更改。对象有一些属性必须通过类型选择来改变,但另一些属性是相同的。这些显示了更改的值,并显示了每个表单的验证消息。这是最好的方法

编辑

我正在考虑创建一个视图模型作为3视图模型的容器。因此,字段将被分开,对于每个"提交"。我将使用三个视图模型中的一个。

这是个好方法?

在MVC中,有许多表单和视图模型的视图的正确方法是什么?

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

我建议,首先,你创建一个包装视图模型来容纳所有特定于表单的视图模型,并在页面上使用一个视图模型,不要忘记实例化那些视图模型(主视图模型的构造函数是一个好地方):

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
}

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

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