Jak mogę przekazać parametry do częściowego widoku w mvc 4

152

Mam taki link:

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

a kiedy to kliknę, wywoła tę częściową stronę:

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

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

    }
}

Częściowa strona _Profile zawiera:

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

Przykład:

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

Wątpię, jak mogę przekazać to „Id” do części model.parameter ?

Moimi kontrolerami są:

 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
źródło
2
Nie rozumiem. Być może, jeśli dodasz kontroler i akcję, może to pomóc, ale tak jak jest teraz napisane, nie rozumiem twojego pytania.
Liam
zobacz informacje o Częściowym rozszerzeniu na msdn
Grundy

Odpowiedzi:

346

Twoje pytanie jest trudne do zrozumienia, ale jeśli rozumiem sedno, po prostu masz pewną wartość w swoim głównym widoku, do której chcesz uzyskać dostęp w częściowym renderowaniu w tym widoku.

Jeśli renderujesz tylko część z tylko częściową nazwą:

@Html.Partial("_SomePartial")

W rzeczywistości przekaże Twój model jako niejawny parametr, tak samo jak w przypadku wywołania:

@Html.Partial("_SomePartial", Model)

Teraz, aby Twoja cząstka faktycznie mogła z tego korzystać, musi mieć również zdefiniowany model, na przykład:

@model Namespace.To.Your.Model

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

Alternatywnie, jeśli masz do czynienia z wartością, która nie znajduje się w modelu Twojego widoku (jest w ViewBag lub w jakiś sposób wygenerowana w samym widoku, możesz przekazać ViewDataDictionary

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

I wtedy:

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

Podobnie jak w przypadku modelu, Razor domyślnie przekaże twoją częściową widok ViewData, więc jeśli masz ViewBag.Idw swoim widoku, możesz odwołać się do tego samego w części.

Chris Pratt
źródło
4
Jeśli model główny zaimplementuje interfejs, widok częściowy może używać tego interfejsu jako modelu. Wtedy możesz uzyskać wiele możliwości ponownego wykorzystania.
Jess
@ChrisPratt Bardzo wyjaśniająca odpowiedź, jak zawsze :) Voted +
Murat Yıldız
6
Musiałem użyć, @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });żeby to zadziałało dla mnie. Używam VS2015 DNX 4.5.1, jeśli ktoś ma ten sam problem.
MikeTeeVee
46

Jedną z najkrótszych metod, które znalazłem dla pojedynczej wartości, gdy szukałem siebie, jest po prostu przekazanie pojedynczego ciągu i ustawienie ciągu jako modelu w takim widoku.

Po twojej stronie częściowego wywoływania

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

A następnie powiązanie modelu z Partial View w ten sposób

@model string

i użycie jego wartości w widoku częściowym w ten sposób

@Model

Możesz także bawić się innymi typami danych, takimi jak tablica, int lub bardziej złożonymi typami danych, takimi jak IDictionary lub coś innego.

Mam nadzieję, że to pomoże,

Osama Sheikh
źródło
4
To jest fajne! Dokładnie to, czego chciałem. Dzięki.
Gautam Jain
Mój fragment nie potrzebował mojego modelu, ale musiałem zachować wszystkie rzeczy ViewData ModelState ... to załatwiło sprawę. W moim częściowym widoku nadal mogę uzyskać dostęp do ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker
Powoduje to NullReferenceException, że odwołanie do obiektu nie jest ustawione na wystąpienie obiektu, mówi się, że Modeljest null. Jakieś pomysły?
facepalm42
15

Oto metoda rozszerzenia, która konwertuje obiekt na 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;
}

Następnie możesz użyć go w swoim widoku w następujący sposób:

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

Co jest o wiele ładniejsze niż new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}składnia.

Następnie w widoku częściowym możesz użyć, ViewBagaby uzyskać dostęp do właściwości z obiektu dynamicznego zamiast właściwości indeksowanych, np

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>
Chris Haines
źródło
Gdzie mam umieścić tę ToViewDataDictionarystatyczną metodę? Wszędzie, gdzie próbuję to umieścić, pojawia się jakiś błąd kompilatora.
Csaba Toth
2
@CsabaToth to jest metoda rozszerzenia. Po prostu umieść go w klasie statycznej, a następnie odwołaj się do tej klasy w swoim widoku.
Chris Haines,
3

W przypadku Asp.Net core lepiej używać

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

Na przykład

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
Gerard
źródło