两个邪恶中哪一个较小? ViewModel中的标记或View中的逻辑?

时间:2012-12-05 18:00:52

标签: c# asp.net-mvc razor markup wcag

我正在开发符合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中的标记,但它是最适合它的地方吗?我错过了一个可以解决这个问题的模式吗?

1 个答案:

答案 0 :(得分:1)

我个人认为“视图中没有代码”是一个强有力的指导方针,但不是绝对的福音。在逻辑

的情况下,我在视图中使用了代码
  1. 简单
  2. 旨在影响视图中的HTML,而不是直接影响模型的状态。
  3. 我认为Matthew的评论认为,制作符合WCAG标准的自定义输入字段的扩展可以很好地运行。它是可重复的,一致的,并且干净地封装了这个问题。