一个Razor视图可以有一个以上的模型,而无需使用视图模型对象?(Can a Razor view

2019-08-08 05:59发布

@model MyMVC.Models.MyMVC.MyModel

@{
    ViewBag.Title = "Index";
}

我为什么问这个问题的原因是MVC我们可以有超过1点的形式,所以我想有一个表单的模型。 但是,当我试图在视图的顶部添加另一种模式,它会显示错误。 我知道我们可以使用视图模型具有模型1和模型2中,但它不是我问的问题。

我只是单纯的想知道有没有什么办法,我们可以把2个型号为1个视图。

更新:

例如,我想在我看来2种形式,所以每种形式,我想有一个分离的模式。

更新2谢谢大家的回复。 现在我知道,MVC只支持一个视图中的一个单一的模式。 难道你们认为这MVC的缺点? 为什么或者为什么不呢?(目前还没有人回答了....为什么?)

你的回答都差不多,所以我甚至不知道哪一个应被设置成一个答案。

Answer 1:

你应该使用一些prtialviews其它型号。 你有你与主力机型主视图。 内部的看法,你可以有一些partialviews与他们的模型及其验证。

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

正如其他人说,这是更好地使用视图模型,并与对方相结合的模式。 但是当你想要我创建了一个示例项目,你在我的帐户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>


Answer 2:

答案很简单:不,你不能有两个型号。

详细信息只有一个声明模型的方式来通过一个视图中使用:

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

有没有方法来指定这些上面的倍数。

除此之外,你只能发送一个对象从控制器,这将是模型的图:

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


Answer 3:

如果你不能/不想修改传递到视图的模型,那么你可以通过额外的对象通过ViewBag对象。 这感觉就像一个黑客攻击我,但它的工作原理:

控制器:

ViewBag["Model2"] = yourObject

视图:

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


Answer 4:

从理论上讲,因为它结合一个模型,一种观点认为你不能做到这一点。 但是你可以创建somethink喜欢它结合了其他两种型号一个型号帮手

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


Answer 5:

从技术上讲,你可以使用自定义WebViewPage编写自己的视图引擎(从RazorViewEngine得到的?),并将它做你想做的。 视图派生自WebViewPage<T>其中T是型号为页的类型。 为了支持多个模型,视图基类需要有多个泛型类型。 使用RazorViewEngine出炉,不过,你只限于每个视图中的单个型号和多控制器架构的假定每个视图的单一模式,所以你不得不重写了。 似乎没有要远点在,但是,因为你可能只是有你的模型是(单)视图模型的属性,然后使用局部视图为每个提供财产型号为局部的形式。

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



Answer 6:

答案是否定的。 这就是为什么视图模型模式存在。 因为剃刀引擎完全在你通过模型依赖,该模型被用于ModelBinding的基本CRUD操作。



Answer 7:

您可以轻松拥有每个表单1个模型。 对于每一个表,你就必须做这样的事情:

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

验证就像一个魅力。

通过这种方式,你可以保持你的模型显示照常信息,并且每个表格1个模型提交数据(例如新闻订阅)



文章来源: Can a Razor view have more then one model without using a ViewModel object?