2013-09-27 28 views
0

我有一个实体,除其他外,以下字段:CreatedByCreatedAtChangedAtModelState.IsValid是假的,因为CreatedBy字段为空

现在看来,我不希望用户填写这些字段。 我的方法是在执行ModelState.IsValid检查之前以及在将数据保存到数据库之前,将它们填充到HTTP POST Action中。

但是,无论如何,ModelState.IsValid都会一直返回false。什么是正确的方式来实现这一点?我应该从POST操作中进行验证(ModelState.IsValid)吗?

+1

ModelState.Errors里面有什么? – Stijn

+0

在'ModelState.IsValid'上添加一个断点并检查'ModelState.Errors'。 –

+0

您是否尝试过将它们填充到页面加载而不是POST?如果你创建一个项目,你可以简单地设置Datetime.Now和当前用户。这些项目将被放入(隐藏)字段中,并且应该在您的Http POST – Marco

回答

2

许多项目要分开视图模型来自域模型。这使您可以创建一个View-Model类,该类专门针对要在特定操作中呈现和/或接收的数据量身定制,同时保持域模型正确/一致。

在您的View-Model类中,您不会将任何此类属性定义为创建日期(因为它不应被发布,而是在操作中确定)。或者,如果您使用同一个视图模型来渲染过帐,并且您想渲染日期,则可以在视图模型上将日期设为空(请参阅Alexey的答案),同时将其保留为域模型。

+0

太好了。 ViewModel实现是完美的解决方案!谢谢chiccodoro。 – fobia

1

DateTime不可为空。如果您想保留这些字段为空模型中结合,如果没有他们的价值使用:

Nullable<DateTime>

或快捷方式:

DateTime? 
3

一个问题,许多解决方案(从最好到最差,在我看来)。

首先溶液

的最佳方式是使用一个ViewModel(只包含的字段的类必须由用户编辑和/或验证)。

在这种情况下,CreatedBy,CreatedAt,ChangedAt字段不会出现在您的ViewModel类中。

解决方法二

如果你不想视图模型,你可以把“不可变的用户”字段隐藏字段在您看来

@Html.HiddenFor(m => m.CreatedAt) 
当然

,隐藏字段可以由用户来改变,所以它总是一个开放的大门,不需要DATAS ...

解决方案三

在检查它是否有效前清除ModelState以避免不必要的错误(如果涉及多个领域,应该会变得非常无聊)。

if (ModelState.ContainsKey("CreatedAt")) { 
    ModelState["CreatedAt"].Errors.Clear(); 
} 

//then test for ModelState.IsValid() 

其他解决方案

白名单,黑名单的模型绑定,或...任何我忘了!

相关问题