Есть ли какая-либо веская причина не использовать ViewComponent вместо частичного представления в core MVC?



Я новичок в MVC и решил начать с .net-core, поэтому у меня нет большого понимания различий между core и более старыми версиями. Я нашел следующий вопрос, который предлагает некоторое понимание, но не помог мне решить, могу ли я в основном игнорировать частичные взгляды.



Почему мы должны использовать компоненты MVC 6 Feature View вместо частичного представления: в чем разница?



Мой вопрос прост - если я могу сделать что-то с ViewComponent, есть ли какая-то веская причина не делать этого куда?



Большое Спасибо!



Пример приведен ниже для контекста.



Вызовы главного вида:



ViewComponent:



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


Против Частичного Представления:



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


Javascript (personCreateForm-это форма в компоненте partial view/view):



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


Код контроллера:



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


Код компонента View:



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

}


И, наконец, страница бритвы, которая одинакова для обоих:



@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>
629   2  

2 ответов:

Это действительно хороший вопрос. Да, бывают случаи, когда лучше реализовать код с частичным представлением, чем с компонентом представления. Если компонент представления не будет иметь сколько-нибудь заметного количества логики (как в вашем примере), то вместо него следует использовать частичное представление.

Компоненты представления-отличный способ разделить логику, и в некоторых отношениях их можно рассматривать как частичное представление, содержащее свою собственную логику. Но если нет никакой логики, что необходимо разделить с частичным представлением, тогда, вероятно, лучше не использовать компонент представления. В таком случае использование компонента представления увеличивает сложность кодирования (есть еще одно место, чтобы посмотреть, как работает код), но не дает никакой реальной выгоды. Как правило, сложность кода следует увеличивать только в той мере, в какой выгоды, получаемые от этой дополнительной сложности, превышают "стоимость" этой сложности.

Надеюсь, это звучит не слишком теоретично. Это в основном сводится к следующему: если есть логика, которую вы хотите упаковать с частичным представлением, чтобы вы могли использовать этот компонент снова и снова, то используйте компонент представления, но если нет никакой логики, которую вам нужно упаковать с ним, то используйте частичное представление.

Похоже, что компоненты View все еще (по состоянию на июль 2016 года) имеют некоторые нерешенные проблемы, связанные с загрузкой javascript и css. Пожалуйста, проверьте: https://blog.mariusschulz.com/2015/11/26/view-components-in-asp-net-mvc-6

Comments

    Ничего не найдено.