gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:33:27 26 4
gpt4 key购买 nike

所以我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com