C# 以asp作为参数的自定义ViewComponent

C# 以asp作为参数的自定义ViewComponent,c#,asp.net-core,asp.net-core-viewcomponent,C#,Asp.net Core,Asp.net Core Viewcomponent,我想把这个包起来: <textarea asp-for="@Model.Content" ...> 但我无法从组件的角度对其进行评估。这不起作用: <!-- ViewComponents/Editor/Default.cshtml --> @model Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression <textarea asp-for="@Model" /> @型号Microsoft.AspNe

我想把这个包起来:

<textarea asp-for="@Model.Content" ...>
但我无法从组件的角度对其进行评估。这不起作用:

<!-- ViewComponents/Editor/Default.cshtml -->
@model Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression
<textarea asp-for="@Model" />

@型号Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression

有什么想法吗?

我认为您正在混合ViewComponents和TagHelper:

视图组件 在以下情况下调用视图组件:

@await Component.InvokeAsync("EditorView", @Model.Property);
// or
<vc:[view-component-name]>
@await Component.InvokeAsync(“EditorView”,“Model.Property”);
//或
尝试以下技巧:

<vc:editor for="@Model.Content" />

标签助手 标记帮助程序的调用方式如下:

<textarea asp-for="@Model.Content">

如果要将ModelExpression传递给基础ViewComponent,然后将其传递给TagHelper,则必须使用
@ModelExpression.Model

<!-- ViewComponents/Editor/Default.cshtml -->
@model Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression
<textarea asp-for="@Model.Model" />

.cshtml模板将与viewcomponent中的模板完全相同。

我认为您正在混合使用
ViewComponents
TagHelpers
。我只想将textarea包装到viewcomponent中,但无法将ModelExpression传递到textarea中。您的回答仅显示如何使用viewcomponent,但无助于将ModelExpression传递到viewcomponent内的textarea。请使用其他类作为优先级。像modelExpression?还是func??我不知道你的意思。什么优先?我已经在使用ModelExpresion*属性。啊,你可能需要重新编码这个部分。或扩展文本区域标记辅助对象。不管怎样,您可能想创建一个标记帮助器。当我将
aspFor
参数重命名为
for
参数时,我仍然存在相同的问题。我无法将其传递给ViewComponent中的标记辅助对象,因为我也在同一条船上。什么样的.NET魔法和魔术在幕后进行,asp才能发挥作用?这些都没有文档记录(我可以找到),我也想为我的项目创建一个可重用视图组件库,但据我所知,我必须手动设置属性名称。@Keith去年在Microsoft的技术演示中应该有很多视频解释这是如何工作的。您最好检查GitHub上的taghelper源代码以帮助您。
<textarea asp-for="@Model.Content">
<!-- ViewComponents/Editor/Default.cshtml -->
@model Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression
<textarea asp-for="@Model.Model" />
[HtmlTargetElement("editor", Attributes = "asp-for", TagStructure = TagStructure.WithoutEndTag)]
public class EditorTagHelper : TagHelper
{
    private HtmlHelper _htmlHelper;
    private HtmlEncoder _htmlEncoder;

    public EditorTagHelper(IHtmlHelper htmlHelper, HtmlEncoder htmlEncoder)
    {
        _htmlHelper = htmlHelper as HtmlHelper;
        _htmlEncoder = htmlEncoder;
    }

    [HtmlAttributeName("asp-for")]
    public ModelExpression For { get; set; }

    [ViewContext]
    public ViewContext ViewContext
    {
        set => _htmlHelper.Contextualize(value);
    }


    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = null;

        var partialView = await _htmlHelper.PartialAsync("TagHelpers/Editor", For);

        var writer = new StringWriter();
        partialView.WriteTo(writer, _htmlEncoder);

        output.Content.SetHtmlContent(writer.ToString());
    }
}