2016-12-28 16 views
7

Próbuję przejść do środowiska ASP.NET Core z mojej małej aplikacji ASP.NET MVC 4.Odpowiednik html.RenderAction w środowisku ASP.NET Core

W mojej aplikacji MVC 4, Mam plik układ, który wykorzystuje RenderSection jak:

@RenderSection("xyz", required: false) 

Następnie, w moim pliku indeksu, mam:

@section xyz{ 
     @{Html.RenderAction("abc");} 
    } 

Więc wzywam kontroler metoda działania abc() z indeksu. Metoda abc() przekazuje obiekt modelu i zwraca częściowy widok z tym modelem. Nie mogę użyć RenderPartial, ponieważ wymaga przekazania modelu.

Teraz, w ASP.NET Core, nie mam metody RenderAction().

Moje pytanie brzmi: w jaki sposób powinienem wywołać metodę działania kontrolera z mojego pliku indeksu? Czy jest tam jakikolwiek inny helper HTML (chociaż nie widzę żadnego)?

.

+2

W ASP.NET Rdzenia '@ Html.Action' (i wiesz, że mówisz o RenderAction, ale Uważam, że wynika to z tej samej koncepcji) zostało zastąpione przez ViewComponents. Spójrz na: http://stackoverflow.com/questions/40341386/net-core-putting-views-inta-a-tabs/40342752#40342752. Pozdrowienia. – dime2lo

+0

Dzięki za link. Pracuję nad implementacją ViewComponents, aby zobaczyć, czy to działa z moim projektem. – user6542823

+0

To wydaje się bolesne. Nie ma również menedżera konfiguracji. Dużo lektury do zrobienia dla małej aplikacji. Czy można go określić jako "Brak zgodności wstecznej z rdzeniem ASP.NET"? – user6542823

Odpowiedz

8

W końcu mogłem to zrobić za pomocą ViewComponent. Tak więc, zamiast RenderAction(), zrobiłem:

@section xyz{ 
     @await Component.InvokeAsync("abc") 
    } 

Gdzie abc jest klasa jako abcViewComponent. ViewComponent wygląda następująco:

public class abcViewComponent : ViewComponent 
    { 
     private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>(); 
     public async Task<IViewComponentResult> InvokeAsync() 
     { 
      MyContext context = new MyContext(db); 
      IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync(); 
      return View(mc); 
     } 
    } 

Potem stworzyliśmy widok pod nowym folderze 'mc' jako Views/Home/components/mc/Default.cshtml

Należy zauważyć, że nazwa widoku jest Default.cshtml i tak działało. Jeśli ktoś ma jakieś lepsze rozwiązanie, proszę dać mi znać.

Dzięki za skierowanie mnie w stronę ViewComponent.

+1

Wiem, że to naprawdę wybredne, ale nazwy klas w C# powinny rozpoczynać się wielką literą, więc twoja klasa komponentu view powinna być 'AbcViewComponent' a tableRowClass powinna być' TableRowClass' oraz context.tableRows powinna być 'context.TableRows'. W przeciwnym razie, cieszę się, że to działa. – akousmata

+1

Dzięki. Mam nazwy jak to stwierdziłeś, tj. Zaczynając od Wielkiej litery w moim projekcie. Na przykład tutaj wspomniałem o małej walizce. Będę o tym pamiętać podczas wysyłania wiadomości w przyszłości. – user6542823

0

Istnieje obejście, można użyć Url.Action + JQuery do renderowania zawartości.

Widok, w którym chcesz, aby uczynić działania będzie wyglądać następująco:

<div id="dynamicContentContainer"></div> 
<script> 
    $.get('@Url.Action("GetData", "Home")', {id : 1}, function(content){ 
      $("#dynamicContentContainer").html(content); 
     }); 
</script> 

Kontroler główna:

[HttpGet] 
public IActionResult GetData(int id) 
{ 
    return PartialView(id); 
} 

Widok

@model int 
 
<span>Values from controler :</span> @Model

Jeśli chcesz mieć większą kontrolę nad życzenie można przeczytać tutaj Więcej informacji: jQuery.get()

0

Tylko dla realizacji powyższej kwestii, to chyba bezpieczniej podać nazwę klasy ViewComponent jak pokazano poniżej:

@section xyz{ 
    @await Component.InvokeAsync(nameof(yournamespace.abc)) 
} 

i chociaż jest to powszechne w użyciu „Default” jako powstałego widoku można również powrócić nazwę widoku, jeżeli różni się od domyślnie:

public class abcViewComponent : ViewComponent 
{ 
    private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>(); 
    public async Task<IViewComponentResult> InvokeAsync() 
    { 
     MyContext context = new MyContext(db); 
     IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync(); 
     return View("YourViewName", mc); 
    } 
}