1

我有一个使用从数据库生成的实体的 ASP.NET MVC3 应用程序。每个实体也有一个单独的部分类,它使用MetadataType属性将每个实体与一个装饰有许多验证属性的类相关联(见下文)。

[MetadataType(typeof(Drawing.Metadata))]
public partial class Drawing
{
    private sealed class Metadata
    {
        [Required]
        [StringLength(50, MinimumLength = 3, ErrorMessage = "Drawing numbers must be between {2} and {1} characters in length.")]
        [DisplayName("Drawing number")]
        public string Number { get; set; }

        [Required]
        [StringLength(255, MinimumLength = 3, ErrorMessage = "Drawing titles must be between {2} and {1} characters in length.")]
        public string Title { get; set; }
    }
}

我的控制器代码如下所示:

[HttpPost]
public ActionResult Create(Drawing drawing)
{
    if (ModelState.IsValid)
    {
        // Save to database here...
        return RedirectToAction("Index");
    }
    else
    {
        return View(drawing);
    }
}

我已使用 Visual Studio 模板创建视图以添加、编辑和删除实体(设计器代码未更改)。

我遇到的问题是,当我创建实体时,只有在启用客户端验证时验证才有效。如果我关闭客户端验证,那么ModelState.IsValid似乎总是返回 true 并将我返回到索引页面。

任何人都可以就如何使用实体框架实体进行服务器端验证提供任何建议吗?

更新:

这个问题好像和我的一样。这篇文章的作者似乎已经解决了这个问题,但没有提及他们是如何解决这个问题的……

4

2 回答 2

1

经过进一步调查,当默认模型绑定器尝试将用户输入值(在本例中为 Null)绑定到实体属性时,我的实体类(从ObjectContext继承)抛出了ConstraintException,似乎出现了我的问题。

我可以看到两种可能的解决方案:

  1. 放松对我的数据库表的约束(我不想这样做)。
  2. 使实体字段可为空(使用实体设计器将可为空的属性设置为是)

我已经使用并测试了第二个选项,并且可以确认服务器端验证现在可以按预期工作。

在研究这个问题的解决方案时,我得出的结论是,问题是由于我的实体继承自 ObjectContext,这是一个相当重的类。我发现了很多使用代码优先方法的教程。在这种情况下,实体类将继承自更轻量级的DbContext ,因此我想这可以被视为该问题的第三种解决方案。

于 2011-11-21T14:01:08.613 回答
1

我找到了解决这个问题的另一种方法。因为我真的不想将我的属性设置为可为空,所以我添加了以下内容:

[DisplayFormat(ConvertEmptyStringToNull = false)]

将以下注释添加到模型属性也可以修复错误。

于 2012-08-05T13:29:37.733 回答