2016-07-06 58 views
12

Sono nuovo di MVC e ho deciso di iniziare con .net-core, quindi non ho molta comprensione delle differenze tra versioni core e versioni precedenti. Ho trovato la domanda qui sotto che offre alcune informazioni ma non mi ha aiutato a decidere se posso sostanzialmente ignorare le viste parziali.C'è qualche buona ragione per NON usare un ViewComponent invece di una Vista parziale in MVC principale?

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

La mia domanda è semplice - se posso fare qualcosa con un ViewComponent, c'è qualche buon motivo per non?

Grazie mille!

Esempio fornito di seguito per il contesto.

Vista principale chiamate:

ViewComponent:

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

Versus Vista parziale:

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

Javascript (personCreateForm è una forma all'interno del componente parziale vista/vista):

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

Controller cod:

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

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

    } 

E infine la pagina di rasoio che è la stessa per entrambi:

@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

Quesita domanda abbastanza supponente, non molto adatta a StackOverflow. Ma un ViewComponent deve essere istanziato e di solito contiene delle dipendenze (iniettate tramite il contenitore IoC) e quindi contiene la logica.Una vista parziale è solo un modello e dovrebbe essere utilizzata dove è già presente un modello e basta renderlo, senza alcuna logica applicativa, quindi si avranno meno allocazioni e istanze dell'oggetto per richiesta – Tseng

risposta

12

E 'una bella domanda. Sì, ci sono casi in cui è meglio implementare il codice con una vista parziale rispetto a un componente di visualizzazione. Se il componente di vista non avrà una quantità apprezzabile di logica (come nel tuo esempio), dovresti invece utilizzare una vista parziale.

View I componenti sono un ottimo modo per compartimentare la logica e, in qualche modo, possono essere pensati come una vista parziale che contiene la propria logica. Ma se non c'è alcuna logica che debba essere suddivisa in compartimenti con la vista parziale, probabilmente è meglio non usare un componente di visualizzazione. In tal caso, l'uso di un componente di visualizzazione aumenta la complessità della codifica (c'è un altro posto dove guardare per vedere come funziona il codice) ma non fornisce alcun vantaggio reale. In generale, si dovrebbe aumentare la complessità del codice solo nella misura in cui i benefici ricevuti da quella complessità aggiunta siano maggiori del "costo" di tale complessità.

Spero che non sembri troppo teorico. In sostanza si riduce a questo: se c'è una logica che si vuole impacchettare con la vista parziale in modo tale che si possa usare quel componente più e più volte, quindi utilizzare un componente di visualizzazione, ma se non c'è alcuna logica che è necessario impacchettarlo quindi utilizzare una vista parziale.