2011-11-01 14 views
61

Czy istnieje sposób, aby uczynić wewnątrz moim zdaniem kontrolera A częściowy widok z innego kontrolera B?Render Częściowy widok z innego kontrolera

Edytuj: Napisałem częściowy widok, który jest dobry tylko dla dwóch kontrolerów i nie chcę go kopiować do ich obu folderów widoków.
Chcę, aby widok częściowy był wyświetlany za każdym razem, gdy widok jest renderowany, nie po tym, jak coś się stanie.

+1

To może oznaczać wiele różnych rzeczy. Czy chcesz ponownie wykorzystać widok (model wygenerowany przez kontroler A)? Czy chcesz wywołać akcję kontrolera, która generuje widok? Czy chcesz używać AJAX do dynamicznego ładowania widoku po renderowaniu strony? – tvanfosson

+0

Możesz być bardziej konkretny. Co dokładnie chcesz osiągnąć? –

+1

@ Html.Action ("YourPartialViewAction", "ControllerName", nowy {id = Model.id}) –

Odpowiedz

75
  1. można podzielić poglądów między kontrolerami poprzez umieszczenie ich w widokach/folderu Shared. Każdy kontroler może następnie renderować ten widok według nazwy.
  2. Możesz renderować widok częściowy (który może być współdzielony między kontrolerami jak w (1)) w bieżącym widoku przy użyciu Html.Partial().
  3. Możesz użyć Html.Action(), aby wywołać akcję na innym kontrolerze i wyświetlić wyniki w bieżącym widoku.
  4. Możesz użyć AJAX do załadowania częściowego widoku z innego kontrolera po wyrenderowaniu strony.
+0

O opcji 3: Czy mogę wywołać mój kontroler i wyświetlić częściowy widok z innego kontrolera? bez użycia względnej ścieżki Dzięki! – gdoron

+0

@gdoron można zlokalizować kod, który generuje widok częściowy w jednym lub drugim kontrolerem i włączyć to za pomocą 'Html.Action()' dla widoków w obu kontrolerów. – tvanfosson

+5

5. możesz również renderować widok jako Widok częściowy, podając pełną ścieżkę jako @ Html.Partial ("~/Views/Partials/Location.cshtml", Model) –

17

Tak,

return PartialView("/path/view.cshtml"); 

Trzeba tylko wypracować część ścieżki.

Alternatywnie można umieścić częściowy widok w widokach/shared a potem po prostu powrotu:

return PartialView("view.cshtml"); 
+1

Nie chcę, aby widok częściowy był udostępniony. A ścieżka względna nie jest odpowiednia dla systemu rutowania mvc. Inne sugestie? – gdoron

+0

Tu tylko drobna wątpliwość. Czy metoda PartialView zwraca kod HTML zakodowany lub surowy HTML? – Karan

1
@model YourModelNamesapce.ModelName 
@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_LayoutForPartialViews.cshtml"; 
} 
<table> 
    <tr> 
     <td> 
      @Html.LabelFor(model => model.fieldname) 
     </td> 
     <td> 
      @Html.DisplayFor(model => model.fieldname) 
     </td> 
    </tr> 
    <tr> 
     <td>@Html.Action("PartialViewAction", "Controller", new { id = Model.id })</td> 
    </tr> 
</table> 
+0

Przepraszam, ale jak to odpowiada na moje pytanie ?! – gdoron

+0

Gordon, zaktualizowałem swoją odpowiedź –

+1

To nie jest bardzo jasna odpowiedź, jednak Hari wskazuje, że DisplayFor jest dobrym rozwiązaniem. – mcfea

44
@Html.Partial("~/Views/ControllerB/Index.cshtml") 
+3

Najprostsze rozwiązanie. : D – wooncherk

+0

Czy można bezpośrednio wywołać akcję na kontrolerze zamiast widoku? – FrenkyB

1

Just a marginesie jak znalazłem ten wątek szukając tego samego pytania, ale odpowiedzi nie działa: w modułach Orchard CMS nie można używać neat solution zamieszczonych przez Pittfall, trzeba używać ścieżek względnych aby powrócić częściowe widoki. Powiedzmy, że masz kontroler

Controllers/SiteController.cs 

i chcesz wrócić częściowego widoku

Shared/MessageList/Items 

następnie w swoich metodach działania trzeba napisać

return PartialView("../Shared/MessageList/Items"); 
Powiązane problemy