标签: asp.net-core-viewcomponent

ASP.NET MVC 6:在单独的程序集中查看组件

我想在MVC 6 Web启动项目的单独程序集中定义视图组件(ASP.NET MVC 6中的新组件),以便我可以在多个Web项目中重用它们.示例解决方案可能如下所示:

  • BookStore.Components (容纳常见视图组件)
  • BookStore.Web1 (引用BookStore.Components)
  • BookStore.Web2 (引用BookStore.Components)

我创建了一个新的类库(Package)并在其中创建了一个视图组件.我还在嵌套文件夹约定之后创建了视图.我的BookStore.Components项目看起来像这样:

在此输入图像描述

当我尝试从我的Web项目调用此视图组件时:

@Component.Invoke("BookOfTheMonth")
Run Code Online (Sandbox Code Playgroud)

...我的内容正文出现了500错误.似乎发现了ViewComponent类,但组件的剃刀视图却没有.

我还尝试扩展,DefaultViewComponentDescriptorProvider以便BookStore.Components可以发现程序集中的视图组件:

定义了AssemblyProvider

 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)

使用Autofac注册的AssemblyProvider

builder.RegisterType<AssemblyProvider>()
    .AsImplementedInterfaces();

builder.RegisterType<DefaultViewComponentDescriptorProvider>()
    .AsImplementedInterfaces();
Run Code Online (Sandbox Code Playgroud)

我不确定是否DefaultViewComponentDescriptorProvider需要上面的注册,所以我尝试使用和不使用它,但我仍然在调用视图组件的页面上得到500错误.

如何从MVC6 Web项目中调用位于单独程序集中的视图组件?

c# asp.net-core-mvc asp.net-core asp.net-core-viewcomponent

19
推荐指数
1
解决办法
5107
查看次数

ajax刷新的Viewcomponent替代方案

我有一个viewcomponent包含嵌入各种页面的一些可重用的业务逻辑.这一直很好.但是,我现在需要使用ajax刷新viewcomponent.

有没有办法实现这个目标?根据我的阅读,这是不可能的,虽然这些信息有点过时了.如果不可能,最好的选择是什么?

ajax asp.net-core-mvc asp.net-core-viewcomponent

17
推荐指数
1
解决办法
2万
查看次数

为什么视图组件在生产中没有渲染?

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

知道为什么吗?我真的不知道为什么会发生这种情况。

asp.net-core asp.net-core-viewcomponent asp.net-core-7.0

13
推荐指数
1
解决办法
1486
查看次数

我的Javascript应该放在View组件的哪个位置?

我已经习惯了在MVC 6中查看组件,几年前我问了一个关于部分视图的类似问题.如果我构建一个封装一个需要自己的Javascript的常见用例的视图组件,我在哪里放置那个Javascript?我知道在部分视图中使用Javascript 是最危险的,但将它包含在视图组件中要简单得多,而不是在包含视图或必须由包含视图引用的单独文件中.

例如,假设我有一个包含两个下拉列表的视图组件.第一个下拉列表中的选择确定第二个下拉列表中显示的项目.当然,这很容易在Javascript中处理,但我在哪里放呢?

javascript c# asp.net-core asp.net-core-viewcomponent

11
推荐指数
1
解决办法
3921
查看次数

我可以通过ajax重新加载asp 5/MVC 6 View Component吗?

我正在玩MVC 6,并且有一个用户网格,目前已注册到我的网站.在网格之上,我为搜索/过滤功能构建了一个View Component.它是通过调用

@Component.Invoke("UserSearchBar")
Run Code Online (Sandbox Code Playgroud)

其中一个要求是能够保存并重新应用下拉列表的值,以便最终用户可以快速访问他/她经常使用的搜索.我在所有已保存搜索的View Component中添加了一个下拉列表.

一旦用户保存搜索,我想重新加载UserSearchBar视图组件以更新下拉列表.

我的问题是:

  1. 按下按钮后如何通过ajax重新加载视图组件?
  2. 在这种情况下,由于视图组件和重新加载的限制,我应该使用Partial而不是视图组件吗?

我可以在View Component中使用Partial来下拉.或者以编程方式向下拉列表添加元素,但是当我单击按钮应用其中一个已保存的搜索时,我仍然会遇到重新加载视图组件的相同问题.


在编写问题时仔细考虑了问题后,我提出了一种更好(更正确?)的方法,不涉及重新加载View Component.在保存时,对保存搜索方法进行ajax调用,并在下拉列表中添加元素.在保存的搜索应用中,调用一个方法,该方法将返回已保存的搜索并应用它.

但是,我仍然想知道是否有可能(以及如何)在MVC 6中重新加载View Component.

ajax asp.net-core asp.net-core-viewcomponent

10
推荐指数
1
解决办法
6690
查看次数

使用asp-for作为参数的自定义ViewComponent

我要包装这个:

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

有任何想法吗?

c# asp.net-core asp.net-core-viewcomponent

10
推荐指数
1
解决办法
1499
查看次数

如何从View组件返回JSON?

我正在尝试将控制器逻辑移动到视图组件类中,但控制器仅返回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

9
推荐指数
1
解决办法
1419
查看次数

HttpContext.RequestAborted 和 CancellationToken 参数有什么区别?

我正在尝试为ASP.NET Core 2.0创建异步视图组件。当用户离开页面时,它会执行一个应该被取消的操作。我有以下选择:

  1. 使用 HttpContext.RequestAborted
  2. 使用 CancellationToken 参数
  3. 我也可以链接令牌

选项 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(看起来像一个错误)。在这两种情况下,都填充了令牌(可能是因为结构?)

有什么区别,我应该使用什么?

asp.net-mvc kestrel .net-core asp.net-core-viewcomponent

9
推荐指数
1
解决办法
4421
查看次数

如何对ViewComponent.Invoke()进行单元测试?

ViewComponentobject中,HttpContext并且User是只读属性.

如何对这样的组件进行单元测试?

我正在使用MSTest Freamwork.

以下属性用于我的代码中

  1. 曲奇饼
  2. 会议
  3. 用户(System.Security.Principal)

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

9
推荐指数
1
解决办法
830
查看次数

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

c# asp.net-core asp.net-core-viewcomponent

8
推荐指数
2
解决办法
2万
查看次数