【问题标题】:Can a Razor view have more than one model without using a ViewModel object?在不使用 ViewModel 对象的情况下,Razor 视图是否可以拥有多个模型?
【发布时间】:2013-01-25 05:56:48
【问题描述】:
@model MyMVC.Models.MyMVC.MyModel

@{
    ViewBag.Title = "Index";
}

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

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

更新:

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

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

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

【问题讨论】:

  • 虽然每个 View 只能有一个 Model,但您可以在 View 中拥有 PartialViews。每个 PartialView 都可以有自己的模型。在您的示例中,每个表单都是其自己的 PartialView。
  • @drovani 感谢您的回复。请用代码表达你的想法好吗?
  • 考虑使用 @Html.Partial() 而不是接受答案中的建议。 @Html.RenderAction 可能存在问题,因为它会查找控制器路由,然后将“部分”呈现为完整视图。这可能会在您的页面中加载 _Layout.cshtml 两次!

标签: asp.net-mvc razor asp.net-mvc-4


【解决方案1】:

您应该为其他模型使用一些 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>

【讨论】:

  • 不客气,Franva,如果您还有其他问题,我在这里。如果你想在一个视图中使用两个或三个模型,最好使用视图模型。无论如何,我很乐意为您提供帮助,因为我下个月要搬到墨尔本:D
【解决方案2】:

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

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

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

上面没有办法指定多个。

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

public ActionResult WhateverAction()
{
    var model = new MyViewModel();
    return View(model);
}

【讨论】:

    【解决方案3】:

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

    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;}
    }
    

    【讨论】:

    • THx Code Told :) 这是一种可行的方式,就像 MVVM 设计模式中的 ViewModel 类
    【解决方案4】:

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

    控制器:

    ViewBag["Model2"] = yourObject
    

    查看:

    @{var Model2 = ViewBag["Model2"] as yourObjectType;}
    

    【讨论】:

      【解决方案5】:

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

      欲了解更多信息,请参阅http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          验证就像一个魅力。

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

          【讨论】:

            【解决方案8】:

            如果您的模型相似, 制作一个新模型,其中包含对您想要的所有模型的引用,然后使用它。 如果模型不相似,您可以使用所有模型中所需的相似字段填充新模型。 但是如果你想使用完全不同的模型,你应该使用局部视图s。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-08
              • 2020-06-07
              • 2012-10-14
              • 2016-10-07
              • 1970-01-01
              相关资源
              最近更新 更多