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

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.


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,


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>

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" />
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.