web-dev-qa-db-ja.com

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

私はこのようなリンクがあります:

 <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

私の疑問は、Iこの "Id"をmodel.parameter partにどのように渡すことができるのかということです。

私のコントローラーは:

 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);
    }
136
neel

あなたの質問は理解するのが難しいですが、私が要点を手に入れているならば、あなたはあなたがそのビューでレンダリングされている部分的にアクセスしたいというあなたのメインビューに単に何らかの価値があります。

部分的な名前だけで部分的にレンダリングするとします。

@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を持っていたなら、あなたはあなたのパーシャルの中で同じものを参照することができます。

321
Chris Pratt

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

あなたの部分的な呼び出し側で

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

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

@model string

そしてこのようにパーシャルビューでその値を使うこと

@Model

配列、int、IDictionaryなどのより複雑なデータ型など、他のデータ型でも遊ぶことができます。

それが役に立てば幸い、

31
Osama Sheikh

これは、オブジェクトを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>
11
Chris Haines

Asp.Netコアの方が使いやすい

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

例えば

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
0
Gerard