标签助手“输入”在元素的属性声明区域中不得包含 C#

Ale*_*xey 7 model-view-controller razor asp.net-core-3.0

我们在构建最近从 .NET Core 2.2 迁移到 3.0 的 ASP.NET Core MVC 应用程序时遇到以下错误:

标签助手“input”(或“textarea”或任何其他)在元素的属性声明区域中不得包含 C#。

我们使用 Razor@functions返回 HTML 属性内容以解决该问题,但是当您使用变量从函数中返回它而没有任何额外逻辑(函数dummy(htmlAttributeContent)返回htmlAttributeContent)时,它看起来很难看

@{
    var roAttrHTML = "";
    if (!user.GotAccessToken("someToken")) {
        roAttrHTML = " readonly=\"readonly\" ";
    }
}
<textarea class="testClass" asp-for="testId" @readonlyAttribute>@Model.Id</textarea>
Run Code Online (Sandbox Code Playgroud)

实际上我们得到了错误

标签助手“textarea”在元素的属性声明区域中不得包含 C#。

当编译我们的 ASP.NET Core MVC 应用程序时,我们需要获取方法(不@functions使用更好),这将为我们提供一种克服该问题的方法(因为我们有很多具有类似逻辑的页面,我们需要触摸一次并避免任何可能的在未来的 .NET Core 版本中支持属性的可能新变化的问题)

Mar*_*ijk 27

如果您不需要使用 TagHelper,您可以<!elementName>对特定元素禁用它:

<!textarea class="testClass" asp-for="testId" @readonlyAttribute>@Model.Id</!textarea>
Run Code Online (Sandbox Code Playgroud)

有关更具结构性的解决方案,请参阅@glenn223 的答案。我通过添加对匿名对象的支持,对他的解决方案做了改进版本:

<!textarea class="testClass" asp-for="testId" @readonlyAttribute>@Model.Id</!textarea>
Run Code Online (Sandbox Code Playgroud)


小智 22

根据文档,您可以在 ASP .NET 5.0 中这样做

<input asp-for="LastName" 
       disabled="@(Model?.LicenseId == null)" />
Run Code Online (Sandbox Code Playgroud)

https://learn.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-5.0#c-in-tag-helpers-attributedeclaration


Mat*_*tus 12

你可以这样做:

@if (!user.GotAccessToken("someToken")) 
{
   <textarea class="testClass" asp-for="testId" readonly>@Model.Id</textarea>
}
else
{
   <textarea class="testClass" asp-for="testId">@Model.Id</textarea>
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我遇到了同样的问题,但我得到了一个简单的解决方案:

抛出错误的代码:

<select asp-for="Journeys.VehicleType" class="test" style="width: 100%;" id="vehicleType" @disabled>
Run Code Online (Sandbox Code Playgroud)

有效的代码:

<select @disabled asp-for="Journeys.VehicleType" class="test" style="width: 100%;" id="vehicleType">
Run Code Online (Sandbox Code Playgroud)

为了让我的 IDE 不抛出错误,我所做的就是将 @disabled 属性移到“asp-for”属性前面。

也适用于普通输入字段:

抛出错误的代码:

<input  type="datetime-local" asp-for="Journeys.StartTime" @disabled id="startTime"/>
Run Code Online (Sandbox Code Playgroud)

有效的代码:

 <input @disabled type="datetime-local" asp-for="Journeys.StartTime" id="startTime"/>
Run Code Online (Sandbox Code Playgroud)

信息:@disabled 只是一个包含空字符串或“已禁用”的变量:

var disabled = "";   
if (Model.Disabled)
{
    disabled = "disabled";       
}
Run Code Online (Sandbox Code Playgroud)

希望这能帮助一些遇到同样问题的人。

  • 在意识到它破坏了绑定之前我就投票了。@awhig 发布的解决方案有效。 (6认同)

小智 3

在创建新的 3.0 应用程序时,我遇到了同样的问题。旧的 2.2 应用程序允许我在声明中包含 C#,即使“它无效” 1

我所做的是使用以下步骤编写自己的 TagHelper 2 :

  1. 创建文件:CustomAttributeTagHelper .cs
namespace {YourBaseNameSpace}.Helpers.TagHelpers
{
    using System.Collections.Generic;
    using Microsoft.AspNetCore.Razor.TagHelpers;

    [HtmlTargetElement(Attributes = "custom-attributes")]
    public class CustomAttributeTagHelper : TagHelper
    {
        public Dictionary<string, string> CustomAttributes { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (CustomAttributes != null)
                foreach (var pair in CustomAttributes)
                    if (!output.Attributes.ContainsName(pair.Key))
                        output.Attributes.Add(pair.Key, pair.Value);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 修改:/Pages/Shared/_ViewImports.cshtml,在微软自己的下面添加以下行@addTagHelper
@addTagHelper {YourBaseNameSpace}.Helpers.TagHelpers.*, {Your Assembly Name}
Run Code Online (Sandbox Code Playgroud)

要点:确保使用程序集名称,而不是上面逗号后面的命名空间

2a. 如果您不确定程序集名称是什么,请在Program=>Main(string[] args)方法中运行以下代码:

Type t = typeof({YourBaseNameSpace}.Helpers.TagHelpers.CustomAttributeTagHelper);
string s = t.Assembly.GetName().Name.ToString();
Console.WriteLine($"The fully qualified assembly name you need is: {s}.");
Run Code Online (Sandbox Code Playgroud)
  1. 然后,您可以在 Razor 页面中像这样简单地使用它:
@{
    Dictionary<string, string> myCustomAttributes = new Dictionary<string, string> {
        ["data-first-custom-attribute"] = "my custom value"
    };

    if (!user.GotAccessToken("someToken")) {
        myCustomAttributes.Add("readonly","readonly");
    }
}

<input custom-attributes="myCustomAttributes" />
Run Code Online (Sandbox Code Playgroud)

注意:此代码可用于任何 TagHelper,这意味着您可以添加您喜欢的任何自定义属性。

如果您只想为单个属性创建它(如上面的只读属性),那么您可以创建一个条件 TagHelper,它需要一个布尔值来构造或作为它的值。

  • 真是蛋疼啊。 (9认同)