- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
首先让我逐步描述我的应用程序。
首先,我有 Entity Framework 生成的模型。在其中我有以下实体:
http://www.codetunnel.com/EFEntities.jpg
现在,为了对实体实现验证,我使用分部类并处理 EF 提供的 OnChanging Hook 。以下是 PostComment
部分类的示例:
namespace CodeTunnel.Domain.Models
{
public partial class PostComment : IDataErrorInfo
{
private Dictionary<string, string> _errors = new Dictionary<string, string>();
partial void OnAuthorChanging(string value)
{
//Validating anything but required value works fine.
//Like this pseudo-validator.
if (value.ToLower() != "fred")
_errors.Add("Author", "Sorry, your name must be Fred.");
}
partial void OnBodyChanging(string value)
{
//Required value validation does not work, I will tell you why below.
if (string.IsNullOrEmpty(value))
_errors.Add("Body", "Body is required.");
}
#region -= IDataErrorInfo methods =-
public string Error
{
get { return string.Empty; }
}
public string this[string columnName]
{
get
{
if (_errors.ContainsKey(columnName))
return _errors[columnName];
return string.Empty;
}
}
#endregion
}
}
请注意,我的类继承自 IDataErrorInfo
。 MVC 默认检查此验证错误。如果它找到任何错误,那么它会使模型无效并使用存储的错误作为 View 中验证助手的消息。我很确定当 EF 抛出异常时,这个字典甚至不会填充该属性的值。事实上,我什至不确定 MVC 是否会在检测到 EF 生成的异常并使模型无效后寻找值。
这是问题的屏幕截图,包括示例伪验证器,因此您可以看到它正在运行:
http://www.codetunnel.com/ValidationError.jpg
如您所见,错误消息并未显示。但是,它确实正确地将字段验证为无效。如果我在那里放一个值,那么它就可以正常验证。我对这个问题做了很多研究,以下是我所知道的:
无法自定义为必填字段显示的错误消息的原因是模型属性不可为空。因为它不可为空,所以尝试将空值绑定(bind)到它会引发异常。 MVC 吞下了这个异常并使模型无效。在发生此异常的任何地方都会生成该消息。我不知道该消息是由 EF 还是 MVC 生成的(我猜是 MVC,因为它首先负责吞噬异常)。我不知道如何自定义此消息。如您所见,它总是说“值”无效。我想这并不完全可怕,但它确实不是很用户友好。
它到达我的名字验证器并检查你的名字是否是“fred”就好了,因为没有抛出异常。就 EF 而言,传入的值很好。直到它到达我的 OnAuthorChanging
方法,它才意识到它不正常。这是正确的行为并且工作得很好。
如果我在我的 OnChanging 事件中抛出异常而不是添加到我的 IDataErrorInfo
字典中,我可以生成相同的验证消息,只是它将输入的值放在单引号之间。示例:
partial void OnAuthorChanging(string value)
{
if (value.ToLower() != "fred")
//_errors.Add("Author", "Sorry, your name must be Fred.");
throw new Exception("Sorry, your name must be Fred.");
}
当输入“test”作为 Author 的值时,该代码显示此消息:“The value 'test' is invalid.”。对于必填字段,它只是值为 null,因此单引号之间没有任何内容。
一些人 ( like this guy ) 建议您只需在模型中将属性设置为可为空即可。这不是一个可接受的解决方案。原因之一是:
Error 3031: Problem in mapping fragments starting at line 313:Non-nullable column PostComments.Body in table PostComments is mapped to a nullable entity property.
另外,简单地设置 nullable 将不适用于不可为 null 的类型,例如 int,将 int 切换为 nullable int 是一个令人讨厌的困惑,我什至不会在这里讨论。
底线是,我想自己处理这些来自 EF 的异常,或者至少自定义它生成的消息,但我不知道如何处理。我完全迷路了。我想做的就是自定义一条关于我认为非常简单的模型验证的消息!
最佳答案
正如您所发现的,MVC 正在根据不可为空的类型验证您的模型。这会在您的自定义验证运行之前向 ModelState 添加错误。
我以前遇到过这个问题,通过在 Action 开始时循环遍历 Modelstate 并删除所有内容,然后进行自定义验证来绕过它(糟糕!!)
然后发现即使你没有使用数据注解作为你的主要验证形式,你也可以自定义抛出的消息,方法是在伙伴类中的非空类型中添加[Required,并指定消息。
是这样的:
[MetadataType(typeof(YourClassMetadata))]
public partial class YourClass
{
//buddyclass to entity class
class YourClassMetadata
{
[Required(ErrorMessage="Your custom overriding error message")]
public int NonNullablePropertyThatIsGivingYouProblems {get;set;}
}
}
我已经开始查看 mvc 的流畅验证 (http://fluentvalidation.codeplex.com),他们似乎通过添加行在 application_start() 中解决了 global.asax 中的问题
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
但我可能错了。
关于c# - 使用 Entity Framework 时处理 ASP.NET MVC 中的必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5357808/
创建使用.NET框架的asp.net页面时,访问该页面的客户端是否需要在其计算机上安装.NET框架? IE。用户访问www.fakesite.com/default.aspx,如果他们没有安装框架,他
我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。 我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我一直想知道为什么微软为这样一个伟大的平台选择了一个如此奇怪的、对搜索引擎不友好的名称。他们就
.Net Framework .Net .NET Standard的区别 1、.NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套
如果有选择的话,您会走哪条路? ASP.NET Webforms + ASP.NET AJAX 或 ASP.NET MVC + JavaScript Framework of your Choice
我有一个 Web 服务,它通过专用连接通过 https 使用第三方 Web 服务,我应用了 ServicePointManager.ServerCertificateValidationCallbac
为什么我应该选择ASP.NET Web Application (.NET Framework)而不是ASP.NET Core Web Application (.NET Framework)? 我在
我在网络上没有找到任何关于包含 .NET Standard、.NET Core 和 .NET Framework 项目的 .NET 解决方案的公认命名约定。 就我而言,我们在 .NET 框架项目中有以
.NET Compact 是 .NET 的完美子集吗? 假设我考虑了屏幕大小和其他限制并避免了 .NET Compact 不支持的类和方法,或者 .NET Compact 是一个不同且不兼容的 GUI
我已经阅读了所有我能找到的关于 connectionManagement 中的 maxconnection 设置的文章:即 http://support.microsoft.com/kb/821268
我现在正在使用asp.net mvc,想知道使用内置的Json或 Json.Net哪个是更好的选择,但我不确定一个人是否比另一个人有优势。 另外,如果我确实选择沿用Json.Net的路线,那么我应该选
在 Visual Studio 中,您至少可以创建三种不同类型的类库: 类库(.NET Framework) 类库(.NET 标准) 类库(.NET Core) 虽然第一个是我们多年来一直使用的,但我
.NET 和 ASP.NET 之间有什么区别?它们有什么关系? 最佳答案 ASP.Net 基于 .Net 框架构建,提供有关 Web 开发的附加功能。 你可以去看看wikipedia article
在安装更高版本(3.0)之前,我需要安装.net框架1.1和2.0吗?或者单独安装 3.0 框架就足够了,并为在早期框架版本上编写的软件提供支持?谢谢 ,丽然 最佳答案 不,您不必安装以前的框架。 我
我正在开发一个项目,人们可以“更新”类别,例如更改类别的名称。我收到以下消息 This is called after clicking update 按钮 with the SQL statemen
.NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复-- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.Coo
我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得很好,但我只是尝试在脚本中放置一些异常处理,但我无法弄清楚如何判断我的 C# 代码抛出了哪种类型的异
我需要你的帮助, 比如我有一个小数类型的变量,我想这样取整。 例如 3.0 = 3 3.1 = 4 3.2 = 4 3.3 = 4 3.4 = 4 3.5 = 4 3.6 = 4 3.7 = 4 3.
我使用过这样的代码:http://msdn.microsoft.com/en-us/library/dw70f090.aspx在 ASP.NET 中工作之前访问数据库(2-3 年前)。我没有意识到我正
自 ConfigurationManager .NET Standard 中不存在,检索正在执行的程序集的应用程序设置的最佳方法是什么,无论是 web.config或 appSettings.{env
我是一名优秀的程序员,十分优秀!