C# MVC4部分模型验证
我有一个带有数据注释的标准EF模型。我有两个专栏。第一个是ID,而另一个是布尔值。在数据库中,两者都不可为空。但是,它们都被标记为“隐藏”属性。在我将表单发布回服务器之前,这些都非常适合UI 模型无法验证。我尝试了Steven Sanderson的建议,创建一个操作过滤器,但是它无法删除我不返回服务器进行验证的值。最后我又回到了我认为很难看的以下几点:C# MVC4部分模型验证,c#,.net,asp.net-mvc,entity-framework,C#,.net,Asp.net Mvc,Entity Framework,我有一个带有数据注释的标准EF模型。我有两个专栏。第一个是ID,而另一个是布尔值。在数据库中,两者都不可为空。但是,它们都被标记为“隐藏”属性。在我将表单发布回服务器之前,这些都非常适合UI 模型无法验证。我尝试了Steven Sanderson的建议,创建一个操作过滤器,但是它无法删除我不返回服务器进行验证的值。最后我又回到了我认为很难看的以下几点: try { ModelState["LocationId"].Errors.Clear(); -- Really ugly! M
try
{
ModelState["LocationId"].Errors.Clear(); -- Really ugly!
ModelState["IsEnabled"].Errors.Clear(); -- Seems really trashy to do it this way
if (ModelState.IsValid)
{
location.IsEnabled = true; -- This will eventually move to my model definition
_repo.InsertOrUpdate(location);
_repo.Save();
return RedirectToAction("Index");
}
return View();
}
catch (DataException ex)
{
ModelState.AddModelError("dataError", ex);
return View();
}
有没有人对如何清理或创建更好的解决方案有任何其他建议或想法
谢谢您可以使用viewmodel并将您想要显示的数据/用户输入从您的实体映射到您的viewmodel。在post中,您将验证viewmodel上的输入数据,将其映射回实体并将其保存到数据库中
另一种方法是从ID和布尔属性中删除
[必需]
数据注释,这种方法是ModelState。IsValid
应不返回false是否在视图中有LocationId和IsEnabled作为隐藏输入?如果是,它们是否在那里填充了适当的值?如果是这样,它们是否在表单中?有没有不使用视图模型的原因?我希望尽可能避免使用视图模型,与定义应用于我的模型和视图的真正简单的规则相比,工作量太大。与创建一个全新的类相比,定义一个模型并指定三行要容易得多。ID字段自动设置为主键,因此按照惯例是“必需的”。作为存储库模式的一部分,我可以处理IsEnabled属性的正确逻辑。我只是试图避免创建新的viewModel并将其吸收到另一个对象中。为了简单起见,我最终使用了viewModel。如果不用这样做就好了。