我正在开发符合WCAG AA标准的网站。这意味着如果输入表单不为null或为空,则它应具有以下属性:
required='required'
value='{the value}'
如果它们为null或为空,则不应存在这些属性。因此,以下两个账户将使WCAG失败。
<input type='date' required='false' value='' />
我开始在剃须刀视图中使用if语句:
@if (Model.HasValue)
{
<input type="date" id="@Model.Name" name="@Model.Name" min="1990-01-01" max="2100-01-01" value="@Model.CoercedValue" />
}
else {
<input type="date" id="@Model.Name" name="@Model.Name" min="1990-01-01" max="2100-01-01" />
}
但是当添加其他可选属性时,这开始变得非常快。添加必需属性后,它将变为四个语句。
我觉得有两种方法可以实现,或者将逻辑推送到ViewModel,以便返回一个属性字符串:
public string this[string key]
{
get {
switch (key){
case "Required":
return IsRequired?"required='required'":String.Empty;
case "Value":
return HasValue ? String.Format("value='{0}'", CoercedValue) : String.Empty;
default:
return String.Empty;
}
}
}
View后面看起来像这样:
<input type='date' @Model["Required"] @Model["Value"] />
替代方法是将此逻辑放在View
中的代码块中@{
RequiredAttr = IsRequired?"required='required'":String.Empty;
ValueAttr = HasValue ? String.Format("value='{0}'", CoercedValue) : String.Empty;
}
以及视图标记的其余部分:
<input type='date' @RequiredAttr @ValueAttr />
我倾向于ViewModel中的标记,但它是最适合它的地方吗?我错过了一个可以解决这个问题的模式吗?
答案 0 :(得分:1)
我个人认为“视图中没有代码”是一个强有力的指导方针,但不是绝对的福音。在逻辑
的情况下,我在视图中使用了代码我认为Matthew的评论认为,制作符合WCAG标准的自定义输入字段的扩展可以很好地运行。它是可重复的,一致的,并且干净地封装了这个问题。