asp-items
Razor&#34; TagHelper&#34;将为<option>
中的每个值为<select>
添加SelectList
。我想修改每个孩子。
具体来说我想禁用其中一些(即添加disabled="disabled"
)。
更具体地说,我想动态地禁用它们中的一些;我使用角度所以我可以ng-disabled="{dynamic_boolean_which_determines_disabled}"
。这意味着可以首先禁用该选项,但在用户进行更改后,可以禁用该选项(无需重新加载页面)。 Angular应该照顾好这个;我认为Angular和TagHelpers应该在理论上合作......
我预计:
我可以某种方式访问将要创建的子<option>
标签的IEnumerable(即SelectList
中每个项目的一个),迭代子标签和SetAttribute(&#34;禁用& #34;)或SetAttribute(&#34; ng-disabled&#34;)...
我试过了:
select[asp-items]
,并尝试GetChildContentAsync()和/或SetContent来获取IEnumerable <option>
标签并迭代它们并处理每个标签,但我认为这只会让我将整个InnerHtml修改为字符串;感觉hacky做一个String.replace,但我可以这样做,如果这是我唯一的选择吗?即ChildrenContent.Replace("<option", "<option disabled=\"...\"")
option
的子select[asp-items]
元素,因此我可以单独处理每个元素。这有效,但不适用于由<option>
创建的动态添加的asp-items
,它仅适用于&#34;字面值&#34; <option>
标记我实际放入我的cshtml标记。我认为这会起作用但不理想
<option></option> <option></option>
的结果作为字符串,并进行字符串替换,但我不想直接使用字符串... asp-items
的工作;即custom-items
。但是,我通过重新做asp-items
可以为我做的工作来重新创造轮子?答案 0 :(得分:0)
所以我还没有读过&#34; AutoLinkHttpTagHelper&#34; in the example使用字符串替换(特别是RegEx替换)来替换每次出现的URL,并指向该URL的<a>
。案件略有不同*,但......
无论如何,一旦我学会停止担心并喜欢字符串修改,这就是我的解决方案:
[HtmlTargetElement("select", Attributes = "asp-items")]
public class AspItemsNgDisabledTagHelper : SelectTagHelper
{
//Need it to process *after* the SelectTagHelper
public override int Order { get; } = int.MaxValue;
//https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring#ProcessAsync
public AspItemsNgDisabledTagHelper(IHtmlGenerator gen) : base(gen) {}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
//Notice I'm getting the PostContent;
//SelectTagHelper leaves its literal content (i.e. in your CSHTML, if there is any) alone ; that's Content
//it only **appends** new options specified; that's PostContent
//Makes sense, but I still wasn't expecting it
var generated_options = output.PostContent.GetContent();
//Note you do NOT need to extend SelectTagHelper as I've done here
//I only did it to take advantage of the asp-for property, to get its Name, so I could pass that to the angular function
var select_for = this.For.Name;
//The heart of the processing is a Regex.Replace, just like
//their example https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring#inspecting-and-retrieving-child-content
var ng_disabled_generated_options = Regex.Replace(
generated_options,
"<option value=\"(\\w+)\">",
$"<option value=\"$1\" ng-disabled=\"is_disabled('{select_for}', '$1')\">");
//Finally, you Set your modified Content
output.PostContent.SetHtmlContent(ng_disabled_generated_options);
}
}
很少有学习机会:
AspForTagHelper
和AspItemsTagHelper
,(有角度的背景暗示相应的属性; asp-for
和asp-items
将是分开的&#34 ;指令&#34;又名TagHelper)。
SelectTagHelper
中找到了我要查找的内容,其中For
和Items
为属性。有道理。SelectTagHelper
,但那不是必要的来回答我原来的问题。只有在你想要访问this.For.Name
时才有必要,但是甚至可能有办法解决这个问题(即在这里重新绑定自己的For属性?)
SelectTagHelper
,也不会阻止基础SelectTagHelper
的单独实例匹配和处理元素。换句话说,元素处理发生在管道中。 <asp-items-select>
之类的新元素来防止SelectTagHelper匹配?但是,没有必要......我只是避免调用base.Process()
。所以除非那个&#39 ;不好的做法...)*以这种方式不同:
<option>
<option>
&#34;标记&#34; SelectTagHelper
中的PostContent
生成(期待在Content
中找到它),我不认为标记生成了-strings-by-content-mods可以与它们相应的TagHelper匹配 - 所以也许我们真的是一样的,因为我们只处理普通的旧字符串SelectList
(<select>
)组成的SelectListItem
(<option>
) - 但该课程对我也没有帮助。
public bool Disabled
这样的属性(记住,这对我来说不够,因为在浏览器中禁用的值可能会变为true或false;仅限客户端),以及{ {1}} - 当然没有像public SelectListGroup Group
那样不标准,也没有&#34;全能&#34;像属性这样的属性可以让我把任意属性(ng-disabled
或其他任何东西)放在那里。