9
@model MyMVC.Models.MyMVC.MyModel

@{
    ViewBag.Title = "Index";
}

我问这个问题的原因是在 MVC 中我们可以有多个表单,所以我想为每个表单都有一个模型。但是当我试图在视图顶部添加另一个模型时,它会显示一个错误。我知道我们可以使用内部有 model1 和 model2 的ViewModel,但这不是我要问的问题。

我只是想知道有什么方法可以将 2 个模型放入 1 个视图中。

更新:

例如,我想在我的视图中有 2 个表单,所以对于每个表单,我都希望有一个单独的模型。

更新 2 谢谢大家的回复。我现在知道 MVC 在一个视图上只支持一个模型。你们认为这是MVC的缺点吗?为什么或为什么不?(还没有人回答……为什么?)

你的答案很相似,所以我什至不知道应该将哪一个设置为答案。

4

7 回答 7

11

您应该为其他模型使用一些 prtialviews。您有主模型的主视图。在该视图中,您可以对它们的模型和验证有一些局部视图。

- - - - - - - - - - - - - - - - - - - 编辑:

正如其他人所说,最好使用视图模型并将模型相互结合。但正如你所愿,我在我的 Github 帐户上为你创建了一个示例项目:

https://github.com/bahman616/ASPNET_MVC_multiple_models_in_a_view_with_partialview.git

这是该项目的简化代码:

这里有两个模型:

public partial class Person
{
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
}
public partial class Company
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}

我想在一个视图中同时创建视图,所以这是父视图:

@model ASP_NET_MVC_Multiple_Models_In_A_View.Models.Person

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm("Create","Person")) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Person</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@{Html.RenderAction("_CompanyCreate", "Company");}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

这是部分观点:

@model ASP_NET_MVC_Multiple_Models_In_A_View.Models.Company

<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

@using (Html.BeginForm("_CompanyCreate","Company")) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Company</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
于 2013-01-25T06:05:07.497 回答
6

简单的回答: 不,你不能有两个模型。

详细信息 只有一种方法可以声明视图使用的模型:

@model [namespace].[path].[ViewModelName]

无法指定上述多个。

除此之外,您只能将一个对象从控制器发送到视图,即模型:

public ActionResult WhateverAction()
{
    var model = new MyViewModel();
    return View(model);
}
于 2013-01-25T06:03:13.667 回答
4

理论上你不能这样做,因为它将一个模型绑定到一个视图。但是您可以创建一些想法,例如将其他两个模型组合在一起的模型助手

public class model1
{
     string var1 {get; set;}
     string var2 {get; set;}
}

public class model2
{
     string var3 {get; set;}
     string var4 {get; set;}
}

public class modelofBoth
{
     model1 mod1 {get; set;}
     model2 mod2 {get; set;}
}
于 2013-01-25T07:23:28.467 回答
4

如果您不能/不想修改传递给视图的模型,那么您可以通过 ViewBag 对象传递附加对象。对我来说这感觉像是一个黑客,但它有效:

控制器:

ViewBag["Model2"] = yourObject

看法:

@{var Model2 = ViewBag["Model2"] as yourObjectType;}
于 2015-06-05T18:51:51.857 回答
2

从技术上讲,您可以使用自定义 WebViewPage 编写自己的视图引擎(从 RazorViewEngine 派生?)并让它做任何您想做的事情。视图派生自WebViewPage<T>whereT是页面模型的类型。为了支持多个模型,视图基类需要有多个泛型类型。但是,使用 RazorViewEngine 中的烘焙后,您仅限于每个视图的单一模型类型,并且大部分控制器框架假定每个视图只有一个模型,因此您也必须重写它。然而,这似乎没有什么意义,因为您可以简单地让您的模型成为(单个)视图模型的属性,然后为每个提供该属性的表单使用局部视图作为局部模型的模型。

有关更多信息,请参阅http://haacked.com/archive/2011/02/21/changeing-base-type-of-a-razor-view.aspx

于 2013-01-25T06:15:06.373 回答
1

答案是否定的。这就是 ViewModel 模式存在的原因。因为 razor 引擎完全依赖于您传递的模型,所以该模型用于 ModelBinding 以进行基本的 CRUD 操作。

于 2013-01-25T06:12:08.217 回答
0

您可以轻松地为每个表单创建 1 个模型。对于每个表单,您只需要执行以下操作:

var model = new MyModel();
@Html.TextBoxFor(m => model.Title)
@Html.ValidationMessageFor(m => model.Title)

验证就像一个魅力。

这样,您可以让您的模型像往常一样显示信息,并且每个表单有 1 个模型来提交数据(例如时事通讯订阅)

于 2015-09-04T14:23:31.107 回答