Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC4部分模型验证_C#_.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# MVC4部分模型验证

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

我有一个带有数据注释的标准EF模型。我有两个专栏。第一个是ID,而另一个是布尔值。在数据库中,两者都不可为空。但是,它们都被标记为“隐藏”属性。在我将表单发布回服务器之前,这些都非常适合UI

模型无法验证。我尝试了Steven Sanderson的建议,创建一个操作过滤器,但是它无法删除我不返回服务器进行验证的值。最后我又回到了我认为很难看的以下几点:

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。如果不用这样做就好了。