mvc 4で部分ビューにパラメーターを渡す方法


152

私はこのようなリンクを持っています:

 <a href='Member/MemberHome/Profile/Id'><span>Profile</span></a>

これをクリックすると、この部分ページが呼び出されます。

 @{
    switch ((string)ViewBag.Details)
    {

        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }

    }
}

部分ページ_Profileに含まれるもの:

Html.Action("Action", "Controller", model.Paramter) 

例:

@Html.Action("MemberProfile", "Member", new { id=1 })   // id is always changing

私の疑問は、この「Id」をmodel.parameterパーツにどのように渡すことができるかということです。

私のコントローラーは:

 public ActionResult MemberHome(string id)
    {
        ViewBag.Details = id;
        return View();
    }
  public ActionResult MemberProfile(int id = 0)
    {
        MemberData md = new Member().GetMemberProfile(id);
        return PartialView("_ProfilePage",md);
    }

2
わかりません。おそらく、コントローラーとアクションを追加すると役立つかもしれませんが、現在書かれているように、私はあなたの質問を理解していません。
リアム

参照部分 MSDNの延長
グランディ

回答:


346

あなたの質問は理解するのが難しいですが、私が要点を理解しているなら、あなたはそのビューでレンダリングされているパーシャルでアクセスしたいいくつかの値をメインビューに持っているだけです。

パーシャル名だけでパーシャルをレンダリングする場合:

@Html.Partial("_SomePartial")

実際にモデルを暗黙的なパラメーターとして渡します。これは、呼び出した場合と同じです。

@Html.Partial("_SomePartial", Model)

さて、パーシャルがこれを実際に使用できるようにするには、たとえば、次のように定義されたモデルも必要です。

@model Namespace.To.Your.Model

@Html.Action("MemberProfile", "Member", new { id = Model.Id })

または、ビューのモデルにない値(それがViewBagにあるか、ビュー自体で生成された値である場合)を処理している場合は、 ViewDataDictionary

@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });

その後:

@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })

モデルと同様に、RazorはViewDataデフォルトで暗黙的にパーシャルビューを渡します。そのためViewBag.Id、ビュー内にある場合は、パーシャル内で同じものを参照できます。


4
メインモデルにインターフェイスを実装させると、部分ビューにそのインターフェイスをモデルとして使用させることができます。その後、それから多くの再利用を得ることができます。
Jess

常に:) +投票として@ChrisPratt非常に説明の答え
ミュラユルドゥズ

6
私は@Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });これのために働く必要がありました。他の誰かがこの同じ問題を抱えている場合は、VS2015 DNX 4.5.1を使用しています。
MikeTeeVee 2016年

46

私が自分自身を検索しているときに単一の値に対して見つけた最短の方法の1つは、単一の文字列を渡して、このようなビューのモデルとして文字列を設定することです。

部分呼び出し側

@Html.Partial("ParitalAction", "String data to pass to partial")

そして、このようにモデルをパーシャルビューにバインドします

@model string

このようなパーシャルビューでの値の使用

@Model

また、配列、int、IDictionaryなどのより複雑なデータ型など、他のデータ型を操作することもできます。

それが役に立てば幸い、


4
これはすごいです!まさに私が欲しかったもの。ありがとう。
ゴータムジャイナ共和国

私のパーシャルにはモデルは必要ありませんでしたが、ViewData ModelStateのものをすべて保持する必要がありました。これでうまくいきました。私の部分ビューでは、引き続きViewContext.ViewData.ModelState.ContainsKey(@ Model.ToString())にアクセスできます
da_jokker

これはNullReferenceException、オブジェクトのインスタンスに設定されていないオブジェクト参照をスローし続け、それModelがnullであると言っています。何か案は?
facepalm42

15

オブジェクトをViewDataDictionaryに変換する拡張メソッドは次のとおりです。

public static ViewDataDictionary ToViewDataDictionary(this object values)
{
    var dictionary = new ViewDataDictionary();
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(values))
    {
        dictionary.Add(property.Name, property.GetValue(values));
    }
    return dictionary;
}

その後、次のようにビューで使用できます。

@Html.Partial("_MyPartial", new
{
    Property1 = "Value1",
    Property2 = "Value2"
}.ToViewDataDictionary())

これはnew ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}構文よりもはるかに優れています。

次に、部分ビューで、を使用ViewBagして、インデックス付きのプロパティではなく、動的オブジェクトのプロパティにアクセスできます。

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>

このToViewDataDictionary静的メソッドはどこに置くべきですか?どこにでも配置しようとすると、なんらかのコンパイラエラーが発生します。
Csaba Toth 2018年

2
@CsabaTothこれは拡張メソッドです。静的クラスに配置し、ビューでそのクラスを参照するだけです。
クリスヘインズ2018年

3

Asp.Netコアの場合、より適切に使用します

<partial name="_MyPartialView" model="MyModel" />

だから例えば

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.