【发布时间】: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