9
@model MyMVC.Models.MyMVC.MyModel

@{
    ViewBag.Title = "Index";
}

この質問をする理由は、MVCでは複数のフォームを使用できるため、フォームごとにモデルを作成したいと思います。しかし、ビューの上部に別のモデルを追加しようとすると、エラーが表示されます。model1とmodel2を内部に持つViewModelを使用できることは知っていますが、それは私が尋ねている質問ではありません。

2つのモデルを1つのビューに入れる方法があるかどうかを知りたいだけです。

アップデート:

たとえば、ビューに2つのフォームを表示したいので、フォームごとに別々のモデルを作成します。

アップデート2 ご返信ありがとうございます。MVCは、1つのビューで1つのモデルのみをサポートすることがわかりました。これはMVCの欠点だと思いますか?なぜまたはなぜそうではないのですか?(まだ誰もそれに答えていません....なぜですか?)

あなたの答えは似ているので、どちらを答えとして設定すべきかさえわかりません。

4

7 に答える 7

11

他のモデルには、いくつかのprtialviewを使用する必要があります。メインモデルのメインビューがあります。そのビューの中に、モデルと検証を含むいくつかの部分ビューを含めることができます。

- - - - - - - - - - - - - - - - - - - 編集:

他の人が言ったように、ビューモデルを使用してモデルを互いに組み合わせる方が良いです。しかし、あなたが望むように、私は私のGithubアカウントであなたのためにサンプルプロジェクトを作成しました:

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

そのプロジェクトの簡略化されたコードは次のとおりです。

2つのモデルがあります:

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

両方が1つのビューにビューを作成するようにしたいので、これは親ビューです。

@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

簡単な答え: いいえ、2つのモデルを持つことはできません。

詳細 ビューで使用されるモデルを宣言する方法は1つだけです。

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

上記の複数を指定する方法はありません。

それに加えて、コントローラーからのビューに送信できるオブジェクトは1つだけです。これは、モデルになります。

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

理論的には、1つのモデルを1つのビューにバインドするため、これを行うことはできません。ただし、他の2つのモデルを1つに組み合わせたモデルヘルパーのようなものを作成することはできます。

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>どこにあるかから派生します。T複数のモデルをサポートするには、ビューの基本クラスに複数のジェネリック型が必要です。ただし、ベイク処理されたRazorViewEngineを使用すると、ビューごとに1つのモデルタイプに制限され、コントローラーフレームワークの多くは、ビューごとに1つのモデルを想定しているため、それも書き直す必要があります。ただし、モデルを(単一の)ビューモデルのプロパティにするだけで、プロパティをパーシャルのモデルとして提供するフォームごとにパーシャルビューを使用できるため、あまり意味がないようです。

詳細については、http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspxを参照してください。

于 2013-01-25T06:15:06.373 に答える
1

答えはノーです。そのため、ViewModelパターンが存在します。かみそりエンジンは渡されたモデルに完全に依存しているため、このモデルは基本的なCRUD操作のModelBindingに使用されます。

于 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 に答える