Wie kann ich in mvc 4 Parameter an eine Teilansicht übergeben?

152

Ich habe einen Link wie diesen:

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

und wenn ich darauf klicke, wird diese Teilseite aufgerufen:

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

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

    }
}

Teilseite _Profil enthält:

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

Beispiel:

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

Mein Zweifel ist, wie kann ich diese "Id" an model.parameter übergeben ?

Meine Controller sind:

 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);
    }
neel
quelle
2
Ich verstehe es nicht Vielleicht hilft es, wenn Sie Ihren Controller und Ihre Aktion hinzufügen, aber wie es jetzt geschrieben steht, verstehe ich Ihre Frage nicht.
Liam
siehe über Teilerweiterung auf msdn
Grundy

Antworten:

345

Ihre Frage ist schwer zu verstehen, aber wenn ich das Wesentliche verstehe, haben Sie einfach einen Wert in Ihrer Hauptansicht, auf den Sie in einem Teil zugreifen möchten, der in dieser Ansicht gerendert wird.

Wenn Sie nur einen Teil mit nur dem Teilnamen rendern:

@Html.Partial("_SomePartial")

Es wird Ihr Modell tatsächlich als impliziten Parameter übergeben, so als ob Sie Folgendes aufrufen würden:

@Html.Partial("_SomePartial", Model)

Damit Ihr Teil dies jedoch tatsächlich nutzen kann, muss auch ein definiertes Modell vorhanden sein, zum Beispiel:

@model Namespace.To.Your.Model

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

Wenn Sie es alternativ mit einem Wert zu tun haben, der nicht im Modell Ihrer Ansicht enthalten ist (er befindet sich im ViewBag oder einem Wert, der irgendwie in der Ansicht selbst generiert wurde), können Sie a übergeben ViewDataDictionary

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

Und dann:

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

Wie beim Modell übergibt Razor Ihrem Teil implizit ViewDatastandardmäßig die Ansicht. Wenn Sie also ViewBag.Idin Ihrer Ansicht hatten, können Sie dasselbe in Ihrem Teil referenzieren.

Chris Pratt
quelle
4
Wenn Ihr Hauptmodell eine Schnittstelle implementiert, kann die Teilansicht diese Schnittstelle als Modell verwenden. Dann können Sie viel Wiederverwendung daraus ziehen.
Jess
@ChrisPratt Sehr erklärende Antwort wie immer :) Voted +
Murat Yıldız
6
Ich musste das nutzen @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });, um für mich zu arbeiten. Ich verwende VS2015 DNX 4.5.1, wenn jemand anderes das gleiche Problem hat.
MikeTeeVee
46

Eine der kürzesten Methoden, die ich bei der Suche nach mir selbst für einen einzelnen Wert gefunden habe, besteht darin, nur eine einzelne Zeichenfolge zu übergeben und die Zeichenfolge als Modell in dieser Ansicht festzulegen.

Auf Ihrer Teilrufseite

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

Und dann binden Sie das Modell mit Partial View wie folgt

@model string

und die Verwendung seines Wertes in der Teilansicht wie folgt

@Model

Sie können auch mit anderen Datentypen wie Array, Int oder komplexeren Datentypen wie IDictionary oder etwas anderem spielen.

Ich hoffe es hilft,

Osama Sheikh
quelle
4
Das ist ordentlich! Genau das, was ich wollte. Vielen Dank.
Gautam Jain
Mein Teil brauchte mein Modell nicht, aber ich musste das gesamte ViewData ModelState-Zeug beibehalten. Dies war der Trick. In meiner Teilansicht kann ich weiterhin auf ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
zugreifen
Dadurch wird immer wieder eine NullReferenceExceptionObjektreferenz ausgelöst, die nicht auf eine Instanz eines Objekts festgelegt Modelist. Dies bedeutet , dass diese null ist. Irgendwelche Ideen?
facepalm42
15

Hier ist eine Erweiterungsmethode, mit der ein Objekt in ein ViewDataDictionary konvertiert wird.

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

Sie können es dann in Ihrer Ansicht folgendermaßen verwenden:

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

Welches ist viel schöner als die new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}Syntax.

In Ihrer Teilansicht können Sie dann ViewBagvon einem dynamischen Objekt aus auf die Eigenschaften zugreifen, anstatt von indizierten Eigenschaften, z

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>
Chris Haines
quelle
Wo soll ich diese ToViewDataDictionarystatische Methode platzieren? Überall, wo ich es auszudrücken versuche, erhalte ich eine Art Compilerfehler.
Csaba Toth
2
@CsabaToth Dies ist eine Erweiterungsmethode. Platzieren Sie es einfach in einer statischen Klasse und verweisen Sie dann in Ihrer Ansicht auf diese Klasse.
Chris Haines
3

Für Asp.Net Core verwenden Sie besser

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

So zum Beispiel

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