2016-07-06 8 views
12

Jestem nowy w MVC i postanowiłem zacząć od .net-core, więc nie mam wielkiego zrozumienia różnic w rdzeniu w stosunku do starszych wersji. Znalazłem poniższe pytanie, które oferuje pewien wgląd, ale nie pomogło mi zdecydować, czy mogę zasadniczo zignorować częściowe poglądy.Czy istnieje dobry powód, aby NIE używać ViewComponent zamiast częściowego widoku w rdzeniu MVC?

Why should we use MVC 6 Feature View Components over Partial View: What is the difference?

Moje pytanie jest po prostu - jeśli mogę zrobić coś z ViewComponent, czy jest jakiś dobry powód, by nie?

Wielkie dzięki!

Przykład podany poniżej dla kontekstu.

Główne połączenia zobacz:

ViewComponent:

<div class="modal-body" ID="modalPersonInner"> 
     @await Component.InvokeAsync("CreatePerson", new Person()) 
</div> 

Versus częściowym widokiem:

<div class="modal-body" ID="modalPersonInner"> 
    @{ await Html.RenderPartialAsync("People/CreatePartialView", new Person());} 
</div> 

Javascript (personCreateForm jest formą wewnątrz częściowy widok/widok komponentu):

var submitPersonCreate = function(evt) { 

     evt.preventDefault(); 
     if ($(this).valid()) 
     { 
      $.ajax({ 
       type: "POST", 
       url: '@Url.Action("CreatePartial", "People")', 
       data: $('#personCreateForm').serialize(), 
       success(data) { 
        if (data === true) 
         window.location.reload(); 
        else 
         $('#modalPersonInner').html(data); 
       } 
      }); 
     } 

     return false; 
    } 
$('#personCreateForm').submit(submitPersonCreate); 

kod Kontroler:

public async Task<IActionResult> CreatePartial(
     [Bind("AddressLine1,AddressLine2,AddressLine3,AddressLine4,City,Country,Email,Forename,MobileNumber,Postcode,Region,Surname,TelephoneNumber")] Person person) 
    { 
     if (ModelState.IsValid) 
     { 
      _context.Add(person); 
      await _context.SaveChangesAsync(); 
      return Json(true); 
     } 
     //PARTIAL VIEW VERSION 
     //return PartialView("People/CreatePartialView",person); 

     //VIEWCOMPONENT VERSION 
     return ViewComponent("CreatePerson", person); 
    } 

kod ViewComponent:

public class CreatePersonViewComponent : ViewComponent 
    { 
     private readonly AppDbContext db; 

     public CreatePersonViewComponent(AppDbContext context) 
     { 
      db = context; 
     } 

     public async Task<IViewComponentResult> InvokeAsync(Person person) 
     { 

      return View(person ?? new Person()); 
     } 

    } 

I wreszcie strona Razor, który jest taki sam dla obu:

@model Person 

<form ID="personCreateForm"> 
    <div class="form-horizontal"> 
     <h4>Customer</h4> 
     <hr /> 
     <div asp-validation-summary="ModelOnly" class="text-danger"></div> 
     <div class="form-group"> 
      <label asp-for="Forename" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="Forename" class="form-control" /> 
       <span asp-validation-for="Forename" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="Surname" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="Surname" class="form-control" /> 
       <span asp-validation-for="Surname" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="Country" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="Country" class="form-control" Value="UK" /> 
       <span asp-validation-for="Country" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="Region" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="Region" class="form-control" /> 
       <span asp-validation-for="Region" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="City" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="City" class="form-control" /> 
       <span asp-validation-for="City" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="AddressLine1" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="AddressLine1" class="form-control" /> 
       <span asp-validation-for="AddressLine1" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="AddressLine2" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="AddressLine2" class="form-control" /> 
       <span asp-validation-for="AddressLine2" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label asp-for="Postcode" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="Postcode" class="form-control" /> 
       <span asp-validation-for="Postcode" class="text-danger" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      <label asp-for="Email" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="Email" class="form-control" /> 
       <span asp-validation-for="Email" class="text-danger" /> 
      </div> 
     </div> 

     <div class="form-group"> 
      <label asp-for="MobileNumber" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="MobileNumber" class="form-control" /> 
       <span asp-validation-for="MobileNumber" class="text-danger" /> 
      </div> 
     </div> 



     <div class="form-group"> 
      <label asp-for="TelephoneNumber" class="col-md-2 control-label"></label> 
      <div class="col-md-10"> 
       <input asp-for="TelephoneNumber" class="form-control" /> 
       <span asp-validation-for="TelephoneNumber" class="text-danger" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
</form> 
+0

Zadowolone pytanie, które zadawałeś, niezbyt odpowiednie dla StackOverflow. Ale ViewComponent musi być instancjonowany i zwykle zawiera zależności (wstrzyknięte przez kontener IoC), a więc zawiera logikę.Widok częściowy jest tylko szablonem i powinien być użyty w miejscu, w którym masz już model i renderować go bez żadnej logiki aplikacji, wtedy będziesz miał mniej przydziałów i instancji obiektów na żądanie – Tseng

Odpowiedz

12

To bardzo dobre pytanie. Tak, są przypadki, w których lepiej wdrożyć kod z częściowym widokiem niż z komponentem widoku. Jeśli komponent Widok nie będzie miał znacznej ilości logiki (tak jak w twoim przykładzie), powinieneś zamiast tego użyć widoku częściowego.

Zobacz Komponenty to świetny sposób na podzielenie logiki na przedziały i pod pewnymi względami można go traktować jako częściowy widok zawierający własną logikę. Ale jeśli nie ma żadnej logiki, która musi być podzielona na części za pomocą widoku częściowego, prawdopodobnie najlepiej nie używać komponentu View. W takim przypadku użycie komponentu View zwiększa złożoność kodowania (jest jeszcze inne miejsce do sprawdzenia, jak działa kod), ale nie zapewnia żadnej realnej korzyści. Ogólnie rzecz biorąc, powinieneś tylko zwiększyć złożoność kodu w stopniu, w jakim korzyści uzyskane z tej dodatkowej złożoności są większe niż "koszt" tej złożoności.

Mam nadzieję, że to nie brzmi zbyt teoretycznie. Zasadniczo sprowadza się do tego: jeśli istnieje logika, którą chcesz spakować z widokiem częściowym, aby można było używać tego komponentu w kółko, użyj komponentu widoku, ale jeśli nie ma żadnej logiki, której potrzebujesz, aby zapakuj go, a następnie użyj częściowego widoku.

Powiązane problemy