2009-09-03 19 views
72

Jestem bardzo nowy w rozwoju aplikacji internetowych i myślałem, że zacznę od najnowszych technologii i dlatego próbuję nauczyć się asp.net, jak również ramy MVC na raz. Jest to prawdopodobnie bardzo proste pytanie dla Ciebie, profesjonalistów MVC.asp.net MVC częściowy kontroler widoku akcja

Moje pytanie brzmi, czy widok częściowy ma powiązane działanie, a jeśli tak, czy to działanie jest wywoływane za każdym razem, gdy normalna strona używa RenderPartial() w częściowym widoku?

Odpowiedz

130

Chociaż można wykonać działanie, które zwraca częściowy widok, nie trzeba wykonywać akcji renderowania częściowego widoku. RenderPartial pobiera częściowy widok i renderuje go, korzystając z podanego modelu i wyświetlając dane, jeśli są dostarczane, do bieżącego (macierzystego) widoku.

Być może potrzebujesz akcji, która zwróci częściowy widok, jeśli używasz AJAX do ładowania/przeładowywania części strony. W takim przypadku zwrócenie pełnego widoku nie jest pożądane, ponieważ chcesz przeładować tylko część strony. W takim przypadku możesz spowodować, że akcja po prostu zwróci częściowy widok odpowiadający tej sekcji strony.

mechanizm Standardowy

Korzystając z częściowym widokiem w widoku normalnego (brak działania potrzebne)

...some html... 
<% Html.RenderPartial("Partial", Model.PartialModel); %> 
...more html.. 

Ajax mechanizm

Przeładunki część strony poprzez AJAX (uwaga częściowa jest renderowana w linii w początkowym ładowaniu strony)

...some html... 
<div id="partial"> 
<% Html.RenderPartial("Partial", Model.PartialModel); %> 
</div> 
...more html... 

<script type="text/javascript"> 
    $(function() { 
     $('#someButton').click(function() { 
      $.ajax({ 
       url: '/controller/action', 
       data: ...some data for action..., 
       dataType: 'html', 
       success: function(data) { 
       $('#partial').html(data); 
       }, 
       ... 
      }); 
     }); 
    }); 
</script> 

Controller dla AJAX

public ActionResult Action(...) 
{ 
    var model = ... 

    ... 

    if (Request.IsAjaxRequest()) 
    { 
      return PartialView("Partial", model.PartialModel); 
    } 
    else 
    { 
      return View(model); 
    } 
} 
+0

Rozumiem, po prostu bawię się z szablonem VS dla aplikacji MVC. Próbuję wyświetlić wiele list klientów na przykład w częściowym widoku. Obecnie mam klasę modelu przesyłania danych, w jaki sposób wysłać ten model do częściowego widoku bez angażowania widoku strony, który renderuje ten częściowy widok? Dzięki za pomoc! – yogibear

+1

Częściowe jest zawsze uwzględniane w widoku głównym. Jedynym momentem, w którym sam powrócisz do części, byłoby uaktualnienie za pośrednictwem AJAX. Prawdopodobnie użyjesz częściowego do wyświetlenia ** ** listy klientów. Być może użyłbyś pętli foreach w twoim widoku do iteracji na listach (zawartych w modelu widoku), przekazując każdy z nich do częściowego jako jego model. – tvanfosson

+0

+1 Bardzo dobrze! Niezła odpowiedź. –

3

Zaakceptowanych odpowiedź jest całkowicie poprawne, ale chcę dodać, że można załadować częściowy widok stosując obciążenie jQuery. Mniejsza konfiguracja, jeśli nie chcesz brać pod uwagę współbieżności.

$("#Your-Container").load("/controller/action/id"); 
+1

Jedna rada polega na użyciu Url.Action, ponieważ kodowanie na twardo takiej ścieżki złamie aplikację na zmiany trasy lub zmiany w strukturze mapy. –

+0

Całkowicie zgadzam się z tobą @JpHouten. – Saeid

0

Odpowiedź brzmi: nie. Ale czasami potrzebujesz działania kontrolera za częściowym widokiem. Następnie możesz utworzyć actionMethod, który zwraca częściowy widok. Ten actionMethod można nazwać w innym świetle:

@Html.Action("StockWarningsPartial", "Stores") 

actionmethod może wyglądać następująco:

public ActionResult StockWarningsPartial() 
{ 
     ....    
     return View("StockWarningsPartial", warnings); 

} 

i widok Uruchamia 'StockWarningsPartial.cshtml' z:

@{ 
    Layout = null; 
} 

aby go nie renderuj ponownie otaczającego układu.

1

udało mi się osiągnąć coś podobnego z tą logiką.

W .cshtml

@Html.Action("ActionMethodName", "ControllerName"); 

W kontrolerze

[Route("some-action")] 
public ActionResult ActionMethodName() 
{ 
    var someModel = new SomeModel(); 
    ... 
    return PartialView("SomeView.cshtml", someModel); 
} 

I to wszystko.

Jeśli potrzebujesz przekazać wartości z .cshtml do metody akcji, to jest to możliwe.

+1

Doskonały przykład. Pokazałeś interakcję i kod zarówno w kontrolerze, jak i widoku w czysty i przejrzysty sposób. Bez puchu. Dziękuję Ci. – eaglei22

Powiązane problemy