Come posso passare i parametri a una vista parziale in mvc 4


152

Ho un link come questo:

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

e quando faccio clic su questo chiamerà questa pagina parziale:

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

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

    }
}

Pagina parziale _Il profilo contiene:

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

Esempio:

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

Il mio dubbio è che come posso passare questo "ID" alla parte model.parameter ?

I miei controller sono:

 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
Non capisco Forse se aggiungi il controller e l'azione potrebbe essere utile, ma come è scritto ora, non capisco la tua domanda.
Liam,

vedi l' estensione parziale su msdn
Grundy il

Risposte:


347

La tua domanda è difficile da capire, ma se sto ottenendo l'essenza, hai semplicemente un certo valore nella tua vista principale a cui vuoi accedere in un rendering parziale in quella vista.

Se si esegue il rendering di un parziale solo con il nome parziale:

@Html.Partial("_SomePartial")

In realtà passerà il tuo modello come parametro implicito, come se dovessi chiamare:

@Html.Partial("_SomePartial", Model)

Ora, affinché il tuo parziale sia effettivamente in grado di usarlo, però, anche lui deve avere un modello definito, ad esempio:

@model Namespace.To.Your.Model

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

In alternativa, se hai a che fare con un valore che non è nel modello della tua vista (è nel ViewBag o in qualche modo un valore generato nella vista stessa, puoi passare un ViewDataDictionary

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

E poi:

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

Come per il modello, Razor passerà implicitamente la vista parziale ViewDataper impostazione predefinita, quindi se hai avuto ViewBag.Idnella tua vista, puoi fare riferimento alla stessa cosa nella tua parte.


4
Se imposti un'interfaccia al tuo modello principale, puoi avere la vista parziale che usa quell'interfaccia come modello. Quindi puoi riutilizzarlo molto.
Jess,

@ChrisPratt Risposta molto esplicativa come sempre :) Votato +
Murat Yıldız

6
Ho dovuto usare @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });questo per lavorare per me. Sto usando VS2015 DNX 4.5.1 se qualcun altro ha lo stesso problema.
MikeTeeVee,

46

Uno dei metodi più brevi che ho trovato per valore singolo mentre cercavo me stesso, è semplicemente passare una singola stringa e impostare la stringa come modello in vista in questo modo.

Nel tuo lato di chiamata parziale

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

E quindi associare il modello con Vista parziale in questo modo

@model string

e l'utilizzo del suo valore in Visualizzazione parziale in questo modo

@Model

Puoi anche giocare con altri tipi di dati come array, int o tipi di dati più complessi come IDictionary o qualcos'altro.

Spero che sia d'aiuto,


4
Questo è pulito! Esattamente quello che volevo. Grazie.
Gautam Jain,

Il mio parziale non aveva bisogno del mio modello, ma avevo bisogno di preservare tutto il materiale ViewData ModelState .. questo ha funzionato. Nella mia visione parziale, posso ancora accedere a ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker,

Questo continua a generare un NullReferenceExceptionriferimento a un oggetto non impostato su un'istanza di un oggetto, sta dicendo che Modelè nullo. Qualche idea?
facepalm42,

15

Ecco un metodo di estensione che convertirà un oggetto in 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;
}

Puoi quindi usarlo nella tua vista in questo modo:

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

Che è molto più bello della new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}sintassi.

Quindi, nella vista parziale, è possibile utilizzare ViewBagper accedere alle proprietà da un oggetto dinamico anziché dalle proprietà indicizzate, ad es

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

Dove devo mettere questo ToViewDataDictionarymetodo statico? Ovunque provo a metterlo, ottengo una sorta di errore del compilatore.
Csaba Toth,

2
@CsabaToth questo è un metodo di estensione. Inseriscilo in una classe statica e fai riferimento a quella classe nella tua vista.
Chris Haines,

3

Per il core Asp.Net è meglio utilizzarlo

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

Quindi per esempio

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.