【问题标题】:How to make the misleading attribute [ReadOnly] generate a read-only field如何让误导属性【ReadOnly】生成只读字段
【发布时间】:2016-05-26 12:38:49
【问题描述】:

很长一段时间以来,我认为将ReadOnly 属性应用于viewmodel 属性意味着生成的元素将具有readonly HTML 属性。

然后我很失望地发现这个ReadOnly 属性只适用于模型绑定,并且只读输入中的值未绑定到发布的视图模型,人们仍然可以在 UI 字段中输入,让他们认为值会被存储。

现在我必须检查我的视图模型,只要有这个属性,就把它注释掉,然后手动将 HTML readonly 属性应用到受影响的 Razor 元素。

我现在想创建一个ReallyReadOnly 属性,以便为标记为这样的视图模型属性生成真正的只读输入,并将其值绑定回发布的视图模型

如果可以的话,在渲染过程中,我可以在哪里检查并处理这个新属性?

【问题讨论】:

  • 不是一件容易的事。您需要创建自己的 HtmlHelper 扩展方法来读取属性元数据(.IsReadOnly 值)并将 readonly="readonly" 属性添加到它输出的 html。
  • 这不是误导。实际上有数百个属性,其中大多数不适用于模型,并且会被忽略。您有责任了解哪些属性适用,哪些不适用。属性可用于多种用途,因此系统无法警告您。
  • @StephenMuecke 这就是我的想法。一个新的辅助扩展名为例如ReadOnlyInput 读取模型元数据并检查该新属性。既然其他选项似乎很少,为什么不让您的评论成为答案?
  • @ProfK, 不一样,但this answer 给出了一个创建添加属性的帮助器的示例(您可以创建添加readonly 的重载提供htmlAttributes)。在这种情况下,它基于提供bool 参数,但可以将其删除,方法可以只是@Html.ReadOnlyTextBoxFor(m => m.YourProperty)。但是因为扩展方法是特定的,所以没有真正需要使用属性。
  • 另一种方法是创建一个@Html.MyTextBoxFor() 方法,它会读取ModelMetadata.IsReadonly 属性并根据需要添加属性,但这意味着替换视图中所有当前的@Html.TextBoxFor() 方法

标签: c# asp.net-mvc readonly asp.net-mvc-viewmodel readonly-attribute


【解决方案1】:

遗憾的是,我所知道的最简单的解决方案是使用适用于模型的只读编辑器模板,类似于 given here for dates 的描述。

如果您还想为模型绑定应用 ReadOnly,您将有重复,但至少它在完全相同的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2011-04-18
    相关资源
    最近更新 更多