gpt4 book ai didi

c# - 两害相权取其轻? ViewModel 中的标记还是 View 中的逻辑?

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:58 25 4
gpt4 key购买 nike

我正在开发一个符合 WCAG AA 标准的网站。这意味着如果输入表单不为 null 或为空,则它们应具有以下属性:

required='required'
value='{the value}'

如果它们为 null 或空,则不应存在这些属性。因此,以下内容将使两个帐户的 WCAG 失败。

<input type='date' required='false' value='' />

我从 razor View 中的 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" />
}

但是当添加了其他可选属性时,这开始变得非常糟糕。添加required属性后变成4条语句。


我觉得有两种方法可以解决这个问题,要么将逻辑推送到 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;
}

和其余的 View 标记:

<input type='date' @RequiredAttr @ValueAttr />

我倾向于 ViewModel 中的标记,但这是最好的地方吗?我是否缺少可以解决此问题的模式?

最佳答案

我个人认为“ View 中没有代码”是一个强有力的指导方针,但不是绝对的福音。我曾在我的 View 中使用代码,在逻辑是这样的情况下

  1. 简单
  2. 旨在影响 View 中的 HTML,而不直接影响模型的状态。

我认为 Matthew 的评论是制作自定义符合 WCAG 的输入字段的扩展会很有效。它是可重复的、一致的,并且干净地封装了问题。

关于c# - 两害相权取其轻? ViewModel 中的标记还是 View 中的逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13729524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com