在模型上添加动态只读属性

本文关键字:动态 只读属性 添加 模型 | 更新日期: 2023-09-27 18:00:06

在我的控制器MVC中,我有一个Action来显示我的模型(具有3个字段[Code]、[Libele]和[IsActif]的通用模型)。

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
[ActionName("AfficheDetailMotifRejet")]
[AuthorizeRoleFilter(Roles = TypeRoles.Roles.ADMINISTRATEUR_NATIONAL)]
public ActionResult AfficheDetailMotifRejet([DefaultValue(Int64.MinValue)] Int64 id)
{
    DetailGeneric dg = new DetailGeneric { Id = id };
    if (id > 0)
    {
        MotifRejet s = _srvMotifRejet.Charger(id);
        Mapper.CreateMap<MotifRejet, DetailGeneric>();
        dg = Mapper.Map<MotifRejet, DetailGeneric>(s);
    }            
    return View("GererMotifRejet", dg);
}

如果我发送Int64.MinValue作为Id,那么我的Model显示为空,准备插入。但是,当我用现有Id显示给Edit时,我需要使字段[Code]处于ReadOnly模式。

什么是最好的解决方案?

我想在dg中添加[ReadOnly(true)]属性。代码,但如何做到这一点?

然而,我可以用javascript实现这一点,但如果用户没有激活javascript,就会有风险。

谢谢你的帮助。

在模型上添加动态只读属性

您不能在运行时设置属性(例如在"代码"中)。

你最好的选择是创建一个视图模型,它封装了编辑和创建模式,然后做两件事中的一件:

1) 进行@if (Model.IsEditMode)检查,如果为true,则呈现@Html.EditorFor,如果为false,则呈现出@Html.DisplayFor

2) 创建一个绑定到模型的HTML帮助程序,该帮助程序检查模型数据,并根据相同的值调用上述帮助程序之一。

无论哪种方式,如果您想做出相应的决策,您都需要某种"基础"视图模型来创建和编辑视图。

我认为使用自定义元数据提供程序在运行时提供模型元数据是可能的,但解决这个问题的方法是错误的(解决方案太复杂)。

我只想在http发布后的模型中确保实体是可编辑的,并避免在客户端呈现编辑相关的内容。