自从转向MVC以来,我一直想知道(现在需要)一个可重复使用的组件"我可以坚持任何对每个视图都有共同点的视图,并在该组件中包含jQuery。我正在谈论View Components并且它们很整洁,但我还没有遇到过它们的可行需求(除了显示地址或电话号码)。什么都没有真正互动。
因此,如果我无法使用View Component执行此操作,我该怎么办?我有一个使用JavaScript的View Component,但这只是因为我无法引用我在Layout中定义的部分。我已经阅读了数十篇文章,声明这是设计的。嗯,在我看来,这是一个糟糕的设计,并将这些组件锁定为非交互(或有限)。
答案 0 :(得分:1)
创建服务:
public class MyViewContext
{
public bool IsJqueryRequired { get; set; }
public object MyAwesomeSharedObject { get; set; }
}
然后将其添加到作为范围的DI容器(每个新请求都创建了Scoped):
services.AddScoped<MyViewContext, MyViewContext>();
在您的视图中,您可以通过以下方式访问它:
@inject MyViewContext MyViewContext
使用constructor injection简单地使用其他任何地方。
另一个很好的选择是使用TagHelper和TagHelperContext
。 Here是一篇很棒的文章。
答案 1 :(得分:0)
我一直想知道(现在我需要)一个可重复使用的“组件”,我可以坚持任何观点
我认为你要找的是templates。它可以重复使用,因为模型可以有显示和编辑模板。它非常简单:
可重复使用:
public class Car
{
public string Model { get; set; }
}
控制器型号:
public class IndexVM
{
public Car Car { get; set; }
}
index.cshtml
@model IndexVm
@Html.DisplayFor(m => m.Car)
共享/ displaytemplates / car.cshtml
@model Car
@Html.DisplayFor(m => m.Model)
至于脚本,只需要渲染JS的想法很久以前就消失了。这就是Bootstrap有bootstrap.min.js,bootstrap.min.css的原因。没有充分的理由不将捆绑所有内容放在一起,以便客户端可以一次性缓存它。
查看组件我觉得在MVC中有点hacky。它们是MVC和WebPages中工作的所有内容,但并未真正考虑过。