在Model上添加动态ReadOnly属性

时间:2011-06-21 09:24:23

标签: c# javascript asp.net-mvc

在我的Controller MVC中,我有一个Action来显示我的模型(通用模型有3个字段[Code],[Libelle]和[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发送,那么我的模型显示为空,准备插入。 但是当我用一个existant Id显示Edit时,我需要在ReadOnly模式下创建[Code]字段。

什么是最佳解决方案?

我想在dg.Code中添加[ReadOnly(true)]属性,但是如何制作呢?

但是,我可以使用javascript进行此操作,但如果用户没有激活javascript,则存在风险。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您无法在运行时设置属性(例如“代码”)。

您最好的选择是创建一个包含编辑和创建模式的视图模型,然后执行以下两项操作之一:

1)进行@if (Model.IsEditMode)检查,如果为真,则显示@Html.EditorFor,如果为假,则显示@Html.DisplayFor

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

无论哪种方式,如果你想做出相应的决定,你需要为创建和编辑视图提供某种“基础”视图模型。

答案 1 :(得分:0)

我认为可以使用custom metadata provider在运行时提供模型元数据,但这是错误的(解决方案太复杂)方法来解决这个问题。

我只是确保在http发布后的模型中该实体是可编辑的,并避免在客户端渲染编辑相关的东西。