SQL 服务器中的不可空字段仍被视为 ASP.NET MVC 中的必填字段

Not Nullable fields in SQL Server Still Considered Required Fields in ASP.NET MVC

我在 table 中有一个不可为 null 的字段,默认值已在 SSMS 的 属性 "Default Value or Binding" 中设置。我在 ASP.Net mvc 应用程序中链接了这个 table。当我创建视图和 运行 创建视图时,它仍然要求我为不可空字段输入必填字段,即使我为它们分配了默认值。

在此之后我删除了行:

@Html.ValidationMessageFor(model => model.position, "", new { @class = "text-danger" })

每个都在下面 @Html.EditorFor 语句,但这次它 post 我回到了数据库没有任何变化的同一页面。

由于我已经为必填字段设置了默认值,因此如何删除必填字段中的消息?

这是不使用实体模型作为视图模型的众多原因之一。 MVC 不关心必填字段是否具有默认值,该信息与数据库相关,与输入验证无关。

引入不需要这些属性的视图模型,并将发布的视图模型映射到您的实体模型。

因此,给定一个如下所示的实体模型:

public class SomeEntity
{
    // this property is not-nullable in the database
    [Required]
    public string SomeRequiredDatabaseField { get; set; }
}

因为 SomeRequiredDatabaseFieldNOT NULL,它被 Entity Framework 注释为这样,即使它有默认值。 MVC 将选取此注释,并在 属性 没有值时认为模型无效。

现在如果你引入一个viewmodel,你可以告诉MVC不需要这个属性:

public class SomeViewModel
{
    // Not required
    public string SomeRequiredDatabaseField { get; set; }
}

现在在您的控制器中,将视图模型映射到实体模型(最好使用 AutoMapper):

public ActionResult Post(SomeViewModel model)
{
    if (ModelState.IsValid)
    {
        var entityToSave = new SomeEntity
        {
            SomeRequiredDatabaseField = model.SomeRequiredDatabaseField
        };

        db.SomeEntity.Add(entityToSave);
    }

    // ...
}

您只需在模型中创建构造函数即可。一旦创建新实例,它将初始化默认值。如果用户提供该字段,则它将被覆盖。如果否,构造函数的值将传递给 EF。

您现在尝试执行的操作无法按照规范运行:https://msdn.microsoft.com/en-us/library/ms187872.aspx

Here考虑到该字段将始终在数据库中生成,您可以看到如何实现您想要的。