Hoe kan ik parameters doorgeven aan een gedeeltelijke weergave in mvc 4

Ik heb een link zoals deze:

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

en als ik hierop klik, wordt deze gedeeltelijke pagina genoemd:

@{
    switch ((string)ViewBag.Details)
    {
        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }
    }
}

Gedeeltelijke pagina _Profiel bevat:

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

Voorbeeld:

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

Mijn twijfel is dat hoe kan ik deze “Id” doorgeven aan het onderdeel model.parameter?

Mijn controllers zijn:

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

Antwoord 1, autoriteit 100%

Je vraag is moeilijk te begrijpen, maar als ik de essentie begrijp, heb je gewoon wat waarde in je hoofdweergave waartoe je toegang wilt hebben in een gedeeltelijke weergave in die weergave.

Als u alleen een gedeeltelijke rendert met alleen de gedeeltelijke naam:

@Html.Partial("_SomePartial")

Het zal uw model in feite doorgeven als een impliciete parameter, net alsof u zou bellen:

@Html.Partial("_SomePartial", Model)

Om ervoor te zorgen dat jouw part dit ook daadwerkelijk kan gebruiken, moet het ook een gedefinieerd model hebben, bijvoorbeeld:

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

Als u te maken heeft met een waarde die niet in het model van uw weergave staat (deze zit in de ViewBag of een waarde die op de een of andere manier in de weergave zelf wordt gegenereerd), kunt u een ViewDataDictionary

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

En dan:

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

Net als bij het model, zal Razor standaard uw gedeeltelijke ViewDatavan de weergave doorgeven, dus als u ViewBag.Idin uw weergave had, kunt u verwijzen naar de hetzelfde in uw gedeeltelijk.


Antwoord 2, autoriteit 14%

Een van de kortste methoden die ik heb gevonden voor een enkele waarde terwijl ik naar mezelf aan het zoeken was, is het doorgeven van een enkele tekenreeks en het instellen van een tekenreeks als model in het zicht zoals dit.

In uw Gedeeltelijk bellende kant

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

En dan het model binden met Gedeeltelijke weergave op deze manier

@model string

en het gebruik van zijn waarde in Gedeeltelijke weergave op deze manier

@Model

Je kunt ook spelen met andere datatypes zoals array, int of meer complexe datatypes zoals IDictionary of iets anders.

Ik hoop dat het helpt,


Antwoord 3, autoriteit 5%

Hier is een uitbreidingsmethode die een object naar een ViewDataDictionary zal converteren.

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

U kunt het dan als volgt in uw weergave gebruiken:

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

Wat veel mooier is dan de new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}syntaxis.

Vervolgens kunt u in uw gedeeltelijke weergave ViewBaggebruiken om toegang te krijgen tot de eigenschappen van een dynamisch object in plaats van geïndexeerde eigenschappen, bijvoorbeeld

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

Antwoord 4, autoriteit 2%

Voor Asp.Net core kun je beter gebruiken

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

Dus bijvoorbeeld

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

Other episodes