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)
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)
希望这能帮助一些遇到同样问题的人。
小智 3
在创建新的 3.0 应用程序时,我遇到了同样的问题。旧的 2.2 应用程序允许我在声明中包含 C#,即使“它无效” 1。
我所做的是使用以下步骤编写自己的 TagHelper 2 :
CustomAttributeTagHelper .csnamespace {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)
/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)
@{
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,它需要一个布尔值来构造或作为它的值。
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |