我想在MVC 6 Web启动项目的单独程序集中定义视图组件(ASP.NET MVC 6中的新组件),以便我可以在多个Web项目中重用它们.示例解决方案可能如下所示:
我创建了一个新的类库(Package)并在其中创建了一个视图组件.我还在嵌套文件夹约定之后创建了视图.我的BookStore.Components项目看起来像这样:
当我尝试从我的Web项目调用此视图组件时:
@Component.Invoke("BookOfTheMonth")
Run Code Online (Sandbox Code Playgroud)
...我的内容正文出现了500错误.似乎发现了ViewComponent类,但组件的剃刀视图却没有.
我还尝试扩展,DefaultViewComponentDescriptorProvider以便BookStore.Components可以发现程序集中的视图组件:
public class AssemblyProvider : IAssemblyProvider
{
public IEnumerable<Assembly> CandidateAssemblies
{
get
{
yield return typeof(AssemblyProvider).Assembly;
yield return typeof(BookStore.Components.BookOfTheMonthViewComponent).Assembly;
}
}
}
Run Code Online (Sandbox Code Playgroud)
builder.RegisterType<AssemblyProvider>()
.AsImplementedInterfaces();
builder.RegisterType<DefaultViewComponentDescriptorProvider>()
.AsImplementedInterfaces();
Run Code Online (Sandbox Code Playgroud)
我不确定是否DefaultViewComponentDescriptorProvider需要上面的注册,所以我尝试使用和不使用它,但我仍然在调用视图组件的页面上得到500错误.
如何从MVC6 Web项目中调用位于单独程序集中的视图组件?
我有一个viewcomponent包含嵌入各种页面的一些可重用的业务逻辑.这一直很好.但是,我现在需要使用ajax刷新viewcomponent.
有没有办法实现这个目标?根据我的阅读,这是不可能的,虽然这些信息有点过时了.如果不可能,最好的选择是什么?
在 Net Core 7 项目中,我在 Razor 页面上渲染视图组件:
<vc:footer></vc:footer>
Run Code Online (Sandbox Code Playgroud)
组件C#代码是:
public class FooterViewComponent : ViewComponent {
public FooterViewComponent() { }
public IViewComponentResult Invoke() {
return View("Footer");
}
}
Run Code Online (Sandbox Code Playgroud)
文件中的 HTML/Pages/Shared/Components/Footer/Footer.cshtml是:
<footer>My Footer Test</footer>
Run Code Online (Sandbox Code Playgroud)
当我在计算机中运行该应用程序时,将呈现页脚。
但是,当我在生产中发布到服务器时,页脚视图组件不会呈现。
当在浏览器中检查页面的代码时,它显示:
<vc:footer></vc:footer>
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?我真的不知道为什么会发生这种情况。
我正在玩MVC 6,并且有一个用户网格,目前已注册到我的网站.在网格之上,我为搜索/过滤功能构建了一个View Component.它是通过调用
@Component.Invoke("UserSearchBar")
Run Code Online (Sandbox Code Playgroud)
其中一个要求是能够保存并重新应用下拉列表的值,以便最终用户可以快速访问他/她经常使用的搜索.我在所有已保存搜索的View Component中添加了一个下拉列表.
一旦用户保存搜索,我想重新加载UserSearchBar视图组件以更新下拉列表.
我的问题是:
我可以在View Component中使用Partial来下拉.或者以编程方式向下拉列表添加元素,但是当我单击按钮应用其中一个已保存的搜索时,我仍然会遇到重新加载视图组件的相同问题.
解
在编写问题时仔细考虑了问题后,我提出了一种更好(更正确?)的方法,不涉及重新加载View Component.在保存时,对保存搜索方法进行ajax调用,并在下拉列表中添加元素.在保存的搜索应用中,调用一个方法,该方法将返回已保存的搜索并应用它.
但是,我仍然想知道是否有可能(以及如何)在MVC 6中重新加载View Component.
我要包装这个:
<textarea asp-for="@Model.Content" ...>
Run Code Online (Sandbox Code Playgroud)
到可重用的ViewComponent,其中属性将是参数:
<vc:editor asp-for="@Model.Content" />
Run Code Online (Sandbox Code Playgroud)
我能够将asp-for参数传递给viewcomponent:
public class EditorViewComponent : ViewComponent
{
public IViewComponentResult Invoke(ModelExpression aspFor = null)
{
//when debugging, aspFor has correct value
return View(aspFor);
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法在组件的视图中评估它.这不起作用:
<!-- ViewComponents/Editor/Default.cshtml -->
@model Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression
<textarea asp-for="@Model" />
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在尝试将控制器逻辑移动到视图组件类中,但控制器仅返回JSON,用于客户端窗口小部件,它是我的视图组件的UI.这是核心控制器代码,问题是:
public IActionResult TreeData(string dir = "")
{
var browsingRoot = Path.Combine(_config.BaseDir, dir);
var nodes = new List<TreeNode>();
nodes.AddRange(RecurseDirectory(browsingRoot));
return Json(nodes);
}
Run Code Online (Sandbox Code Playgroud)
这在控制器中很好,但ViewComponent派生类不喜欢Jsonreturn方法.我看到的所有例子都使用return View(*<something>*).
视图组件不应该返回整个响应,所以我想它应该有一个Content返回方法来至少返回纯HTML.
c# json asp.net-core-mvc asp.net-core asp.net-core-viewcomponent
我正在尝试为ASP.NET Core 2.0创建异步视图组件。当用户离开页面时,它会执行一个应该被取消的操作。我有以下选择:
选项 1 如下所示:
public class AmazingMessageViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync(string text, int wait)
{
//uses request aborted
await Task.Delay(wait, HttpContext.RequestAborted);
return View<string>(text);
}
}
Run Code Online (Sandbox Code Playgroud)
选项 2 如下所示:
public class AmazingMessageViewComponent : ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync(CancellationToken cancellationToken, string text, int wait)
{
await Task.Delay(wait, cancellationToken);
return View<string>(text);
}
}
Run Code Online (Sandbox Code Playgroud)
这两个操作都不适用于 Kestrel(看起来像一个错误)。在这两种情况下,都填充了令牌(可能是因为结构?)
有什么区别,我应该使用什么?
在ViewComponentobject中,HttpContext并且User是只读属性.
如何对这样的组件进行单元测试?
我正在使用MSTest Freamwork.
以下属性用于我的代码中
public ViewViewComponentResult Invoke()
{
var vm = new SummaryViewModel();
if (User.Identity is ClaimsIdentity identity && identity.IsAuthenticated)
{
vm.IsAuthenticated = true;
vm.UserName = identity.Claims.FirstOrDefault(c => c.Type == "UserName").Value;
vm.PhotoUrl = identity.Claims.FirstOrDefault(c => c.Type == "FacePicture").Value;
}
return View(vm);
}
[TestMethod]
public void UserSummaryVcTest()
{
var component = new UserSummaryViewComponent();
var model = component.Invoke().ViewData.Model as SummaryViewModel;
Assert.AreEqual("UserName", model.UserName);
}
Run Code Online (Sandbox Code Playgroud) c# unit-testing asp.net-core asp.net-core-mvc-2.0 asp.net-core-viewcomponent
我想从ASP.NET 5,Mvc核心应用程序中的ViewComponent中的表单添加ListItems.
组件视图(Views\Shared\Components\AddListItem\Default.cshtml):
@model ShoppingList.Models.ListItem
<form asp-action="Create">
<div class="form-horizontal">
<hr />
<div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
<!-- some fields omitted for brevity -->
<div class="form-group">
<label asp-for="Description" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Description" class="form-control" />
<span asp-validation-for="Description" 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>
Run Code Online (Sandbox Code Playgroud)
ViewComponent控制器(ViewComponents\AddListItem.cs):
namespace ShoppingList.ViewComponents
{
public class AddListItem : ViewComponent
{
private readonly ApplicationDbContext _context;
public AddListItem(ApplicationDbContext context)
{
_context = context;
}
public IViewComponentResult Invoke(string listId) …Run Code Online (Sandbox Code Playgroud) asp.net-core-viewcomponent ×10
asp.net-core ×8
c# ×6
ajax ×2
.net-core ×1
asp.net-mvc ×1
javascript ×1
json ×1
kestrel ×1
unit-testing ×1