在我的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,则存在风险。
感谢您的帮助。
答案 0 :(得分:2)
您无法在运行时设置属性(例如“代码”)。
您最好的选择是创建一个包含编辑和创建模式的视图模型,然后执行以下两项操作之一:
1)进行@if (Model.IsEditMode)
检查,如果为真,则显示@Html.EditorFor
,如果为假,则显示@Html.DisplayFor
2)创建一个绑定到模型的HTML帮助程序,它检查模型数据并根据相同的值调用上述帮助程序之一。
无论哪种方式,如果你想做出相应的决定,你需要为创建和编辑视图提供某种“基础”视图模型。
答案 1 :(得分:0)
我认为可以使用custom metadata provider在运行时提供模型元数据,但这是错误的(解决方案太复杂)方法来解决这个问题。
我只是确保在http发布后的模型中该实体是可编辑的,并避免在客户端渲染编辑相关的东西。