Asp.net mvc 实体框架使用[ReadOnly(true)]元数据保存属性

Asp.net mvc 实体框架使用[ReadOnly(true)]元数据保存属性,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,MVC5EF6。 我使用脚手架创建了一个编辑页面。保存工作正常,直到我想限制编辑某些属性 我不只是使用: @Html.HiddenFor(model => model.Property) 因为我希望字段在UI中仍然可见。我不想让它在视图中不可编辑,因为它不是真正的MVC-我想从模型中控制属性的编辑(这是一个永远不应该更改但不是主键的字段) 我已经从这里实现了这个解决方案:它工作得非常好。我可以使用注释: [ReadOnly(true)] 在模型中的“我的属性”上,并知道显示的是该属性的

MVC5EF6。 我使用脚手架创建了一个编辑页面。保存工作正常,直到我想限制编辑某些属性

我不只是使用:

@Html.HiddenFor(model => model.Property)
因为我希望字段在UI中仍然可见。我不想让它在视图中不可编辑,因为它不是真正的MVC-我想从模型中控制属性的编辑(这是一个永远不应该更改但不是主键的字段)

我已经从这里实现了这个解决方案:它工作得非常好。我可以使用注释:

[ReadOnly(true)]
在模型中的“我的属性”上,并知道显示的是该属性的哪个视图,它将不可编辑

我认为我有一个完美的解决方案,直到我单击“保存”并得到错误:

Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。刷新ObjectStateManager条目

使用SQL profiler,我发现使用注释[ReadOnly(true)]意味着NULL将被发送到数据库进行保存

有人知道为什么会发生这种情况吗?我能做些什么,使我能够以我认为是一种很好的解决方案的方式来显示我不想编辑的数据,并在模型中控制这些数据


任何其他实现相同目标的建议都是受欢迎的,或者是我的整个设计有缺陷的原因。

如果在按save时将属性设置为ReadOnly,那么出于安全原因,模型绑定将不会获得ReadOnly的值,比如说,如果有人通过开发者控制台删除ReadOnly属性,然后它将启用字段enabling edition,然后它不再是readonly,这就是为什么您在服务器上接收null(模型绑定),这就是为什么在数据库上持久化之前在服务器上再次获取readonly的值


简单地说,readonly it运行正常,因为它应该是这样的

您可能无法将您的类型转换为不同的类型以用于查看,然后返回到DB类型以用于存储。或者只需在该线程中使用接受的答案即可
@Html.TextBoxFor(m=>m.Property,new{@readonly=“readonly”})
接受的答案意味着对可编辑和不可编辑数据的控制在视图中-我认为这不符合MVC的原则。另外,在创建新视图时,我可能会忘记将其设置为只读(或者其他开发人员可能无法完全理解它应该是只读的)-但我承认这是一个解决方案-只是不是一个很好的解决方案。在我看来,拥有同时代表您的数据模型和视图模型的对象似乎也不是一个很好的做法。您是否有一个示例,说明如何再次在服务器上获得价值?我想你的意思是在控制器编辑操作中?只需按照与get Edit方法相同的方式填充模型视图,如果是从数据库中,则应调用数据库again@Rick我还能为你们做些什么呢?投票支持我的答案?对不起,这几天一直很忙,而且这个项目是课外的!!