c# - 在 Controller 内部使用 View 模型时,如何在实体内部保留验证规则?

标签 c# asp.net-mvc entity-framework validation asp.net-mvc-5

所以我的 Models 目录中有一个实体:

public class Event
{
    public int Id { get; set; }

    [Required, MaxLength(50), MinLength(3)]
    public string Name { get; set; }

    [Required, MaxLength(2000)]
    public string Description { get; set; }
}

我想使用 viewModel 将它暴露给 View :

public class BaseEventViewModel
{
    public string Name { get; set; }

    [DataType(DataType.MultilineText)]
    public string Description { get; set; }
}

public class EventCreateViewModel : BaseEventViewModel
{

}

我的理由是,我希望所有的数据验证都在实体上完成,所有的展示内容(比如呈现文本区域)都在 View 模型上完成。然后,我可以使用任意多的 View 模型来表示我的实体,同时保持数据完整性。

所以我更改了我的 Controller 以使用新的 View 模型:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(EventCreateViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            db.Events.Add(new Event
            {
                Name = viewModel.Name,
                Description = viewModel.Description
            });
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(viewModel);
    }

但是,没有完成任何实体验证,我可以提交一个空白表单,该表单会引发 DbEntityValidationException 异常。

大概这是因为 ModelState.IsValid 正在处理 View 模型,而不是 View 模型表示的实体。我怎样才能捕捉到这些验证错误?

最佳答案

在正确的指导下,我实际上找到了答案。如果我将此注释添加到我的 View 模型,它将继承应用于我的实体属性的所有注释:

[MetadataType(typeof(Event))]
public class BaseEventViewModel
{
    public int Id { get; set; }

    public string Name { get; set; }

    [DataType(DataType.MultilineText)]
    public string Description { get; set; }
}

现在,当我提交空白表单时,我会正常显示验证错误。

这确实伴随着必须在我的 View 模型中再次重新定义每个属性的警告,这有点违背了 View 模型只包含您需要的属性的观点,但它适用于我的情况。

关于c# - 在 Controller 内部使用 View 模型时,如何在实体内部保留验证规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28157722/

相关文章:

asp.net-mvc - 在 Azure 上部署后无法加载文件或程序集“System.IdentityModel.Tokens.Jwt”

c# - 无法创建 MyEntities 的实例

C# 将字符串从 foreach 循环传递给方法

asp.net-mvc - 对未经授权的 HTTP 请求的正确响应是什么?

c# - 编译器歧义调用错误-具有Func <>或Action的匿名方法和方法组

c# - 在 MVC 中使用异步操作更新 View

c# - 有什么方法可以将多个嵌套创建 foreach 循环展平为批量创建/插入吗?

c# - 每个层次结构继承的 Entity Framework 表

c# - C#中如何使用文件流复制文件

c# - 如何使用 App.config 和 System.Diagnostics 动态设置日志文件?