2013-02-21 37 views
14

我已经标志着财产只读模型类的工作,像这样:只读属性不会在ASP.NET MVC模型

public class RegisterModel 
{ 
    [Display(Name = "User name")] 
    [ReadOnly(true)] 
    public string UserName { get; set; } 
    ... 
} 

在我看来:

@Html.EditorFor(m => m.UserName) 

但是当我运行应用程序时,文本框不是只读。

我知道我可以在视图中使用html属性,以使其只读,但我宁愿如果这可以在模型类本身完成。

可以实现吗?

+0

尝试+1! – 2013-02-21 06:13:29

+0

好吧不会吧,你觉得这是神奇的 – 2015-11-24 10:20:36

回答

14

[更新]我不认为这是可能没有new { @readonly = "readonly" }Readonly属性指定此属性绑定的属性是只读还是读/写。 Details Here.

但你可以尝试为Custom Helpers,或者尝试使用Editable代替Readonly在模型上,并在您查看使用元数据属性。

[Editable(false)] 

我猜你已经看过成 Does ReadOnly(true) work with Html.EditorForModel?

也 罚款文章odetocode.com

+0

另一个优点,但更重要的是,不要指望一切注释。他们很棒,但是我们被宠坏了,并期望他们在我们之后经常擦一擦 – 2013-02-21 06:16:31

+5

对于这是如何选择的答案感到困惑我设置了一个简单的示例项目,并且此解决方案不起作用。是唯一的解决方案。我明白他希望在模型中指定它,但不能这样做。 – CoderSteve 2014-11-05 13:20:47

+0

我想指出的是,虽然在html中只读设置它会阻止一般用户编辑文本框,但任​​何对HTML和JavaScript有一点了解的人都会弄乱一切,所以不要依赖html属性来保护您的数据。目标是防止模型被改变,而不管前端发生了什么。 – 2016-10-27 19:52:41

7

ReadOnly属性不会将输入设置为只读。

试试这个

Html.TextBoxFor(x => x.UserName, new { readonly = "readonly" }) 
+0

谢谢,但正如我所说,我不想用html方式来做到这一点,我正在寻找一些解决方案,将生成“只读“当从模型中读取元数据时进入html – 2013-02-21 06:10:34

+0

@EdiWang悲伤这是真的。当我回答问题时,我正准备发布。 – 2013-02-21 06:10:47

+0

@Dave A哦,真的吗?这是不好的..... :( – 2013-02-21 06:11:54

0

如果你使用,你必须使用{获得制定者;私人设置; }。这将使得客户无法改变价值。您也可以使用HTML 5输入并在其中标记。

9

ReadOnly属性不会阻止HMTL助手将该字段显示为已启用的输入。这是唯一的MVC数据粘结剂将尊重的信息。

这意味着RegisterModel情况下,这将表单提交后由用户回发,总会有null价值上是UserName财产,不管用户输入的表单的相应字段。

+0

我完全误解了'ReadOnly'的作用。这澄清了它。谢谢! – Bobson 2015-06-18 21:51:53