有没有什么好的理由不在核心MVC中使用ViewComponent而不是Partial View?

我是MVC的新手,并决定从.net-core开始,所以我对核心版本与旧版本的差异没有多少了解。 我确实找到了以下问题提供了一些见解,但没有帮助我决定我是否可以基本上忽略部分观点。

为什么我们应该在部分视图上使用MVC 6function视图组件:有什么区别?

我的问题很简单 – 如果我可以使用ViewComponent做某事,有什么理由不这样做吗?

非常感谢!

下面提供了上下文的示例。

主视图调用:

ViewComponent:

 

部分视图:

  

Javascript(personCreateForm是局部视图/视图组件中的一个表单):

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

ViewComponent代码:

  public class CreatePersonViewComponent : ViewComponent { private readonly AppDbContext db; public CreatePersonViewComponent(AppDbContext context) { db = context; } public async Task InvokeAsync(Person person ) { return View(person ?? new Person()); } } 

最后是两个相同的Razor页面:

 @model Person 

Customer


这是一个非常好的问题。 是的,在某些情况下,您最好使用部分视图而不是使用View Component来实现代码。 如果View Component不会有任何可观的逻辑(如您的示例中所示),那么您应该使用局部视图。

视图组件是划分逻辑的好方法,在某些方面可以被视为包含它自己的逻辑的局部视图。 但是如果没有任何逻辑需要与局部视图划分,那么最好不要使用View Component。 在这种情况下,使用视图组件会增加编码复杂性(还有另一个地方可以查看代码是如何工作的)但不提供任何实际好处。 通常,您应该只增加代码复杂性,使得从增加的复杂性中获得的收益大于该复杂性的“成本”。

我希望这听起来不太理论化。 它基本归结为:如果有逻辑要用局部视图打包,以便可以反复使用该组件,那么使用View Component,但如果没有你需要的任何逻辑用它打包然后使用局部视图。

看来View Components仍然(截至2016年7月)有一些与javascript和css加载相关的未解决问题。 请检查: https : //blog.mariusschulz.com/2015/11/26/view-components-in-asp-net-mvc-6