我搜索了很多地方,并没有看到任何与我的想法相似的东西。
假设我想创建一个可重用的容器组件,如卡片、表单或模式,并将其保存为视图组件。我将如何在该主视图组件的“主体”内添加一个新的视图组件,以使其最大程度地可重用?
这里的语法当然只是为了演示这个想法,但例如,像这样:
<vc:parent var1="x" var2="y">
<vc:child var3="a" var4="b"></vc:child>
<vc:child var3="c" var4="d"></vc:child>
</vc:parent>
Run Code Online (Sandbox Code Playgroud)
这样的事情有可能吗?
这不一定需要使用视图组件——也许是部分视图?——只要实现重用其他可重用元素的容器的主要目标。
我已经研究过帮助程序,但它们在 ASP.NET Core 中不再可用。
asp.net-core razor-pages asp.net-core-viewcomponent view-components
看来在 ASP.NET Core MVC 中,如果我想使用视图组件,我必须将它们放入Views\\Shared\\Components\\[ViewComponentName],然后将文件命名为“Default.cshtml”。
这是相当令人沮丧的,因为在一个大型项目的开始,我正在帮助从 Perl CGI 进行移植,我正在创建大量的视图组件,并在 Visual Studio 中拥有五个选项卡,全部命名为Default.cshtml是令人困惑的。
有什么办法可以避免这种命名约定吗?也许甚至可以将它们从文件夹中取出,以便文件看起来像\xe2\x80\xa6?
\nViews\\Shared\\Components\\[ViewComponentName].cshtml\nRun Code Online (Sandbox Code Playgroud)\n我不知道是否只有一些设置可以调整或者什么。大多数情况下,我对 ASP.NET 非常陌生,并且仍在摸索中。使用 ASP.NET Framework 而不是 ASP.NET Core一种选择,但我不想这样做,因为很多样板已经完成。
\nViewComponents 的文档是这样说的:
\n\n\n我们建议您将视图文件命名为 Default.cshtml 并使用 Views/Shared/Components/{View Component Name}/{View Name} 路径。
\n
这让我认为有一种方法可以绕过这个限制,但它没有具体说明它是如何工作的或者它会是什么样子。
\nasp.net-core-mvc asp.net-core asp.net-core-viewcomponent view-components
我正在使用ViewComponent gem 和 Tailwind CSS。我使用 <%= render ExampleComponent.new(resource: @resource) %> 从视图文件渲染组件。在我的 app/components 目录中,我有 example_component.rb 和 example_component.html.erb 文件。该组件渲染良好。但是,如果我有使用响应式实用程序变体的 Tailwind CSS 类,那么它们是否有效就很重要了。例如,假设我正在使用视图组件进行渲染:
# app/components/example_component.rb
class ExampleComponent < ViewComponent::Base
def initialize(resource:)
@resource = resource
end
end
Run Code Online (Sandbox Code Playgroud)
使用视图组件 html.erb 文件:
# app/components/example_component.html.erb
<%= form_with url: resource_path, target: '_top', class: 'mb-2 md:mb-0' do |f| %>
<%= f.hidden_field :resource_id, value: @resource.id %>
<%= f.submit 'Submit', class: "w-full md:w-fit" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
当显示器为中等 (md) 或更大时,Tailwind 类使底部边距从 2 更改为 0。此外,当显示器为中等或更大时,提交按钮从宽度 100% 更改为宽度 fit-content。如果我使用视图目录中的部分部分的通常 Rails 渲染来渲染它,它就可以正常工作。如果我使用 ViewComponent …
ruby ruby-on-rails responsive-design tailwind-css view-components
我正在尝试从不同的程序集加载 ViewComponent 但在主项目中我收到以下错误
InvalidOperationException:找不到名为“Pro.ItemViewComponent”的视图组件。视图组件必须是公共非抽象类,不包含任何泛型参数,并且用“ViewComponentAttribute”修饰或具有以“ViewComponent”后缀结尾的类名。视图组件不得用“NonViewComponentAttribute”修饰。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None
Remove="Views\Shared\Components\ContainerViewComponent\Default.cshtml"/>
<None Remove="Views\Shared\Components\ItemViewComponent\Default.cshtml" />
<None Remove="Views\Shared\_ViewImports.cshtml" />
</ItemGroup>
<ItemGroup>
<Content
Include="Views\Shared\Components\ContainerViewComponent\Default.cshtml">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Include="Views\Shared\Components\ItemViewComponent\Default.cshtml">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
<Content Include="Views\Shared\_ViewImports.cshtml">
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<Pack>$(IncludeRazorContentInPack)</Pack>
</Content>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Views/**/*.cshtml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.1" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
var assembly = typeof(Pro.ItemViewComponent).Assembly;
var embeddedFileProvider = new EmbeddedFileProvider(
assembly,
"Pro"
);
services.Configure<RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(embeddedFileProvider);
});
Run Code Online (Sandbox Code Playgroud)
我在 StackOverflow 中关注了许多文章和一些问题和答案,但没有找到任何解决方案,我应该怎么做才能从不同的程序集中共享 ViewComponent?
c# assembly-references asp.net-core-mvc asp.net-core-viewcomponent view-components