在我的metadata.cs文件中,当我在AddRecord控制器操作中点击_db.SaveChanges()时,这适用。"[AssertThat("适用于Add SaveChanges(),但不适用于Edit SaveChanges)。"[必需]"适用于两者。"ss"不会传递Add SaveChanges(),而是传递Edit SaveChanges。
[Required(ErrorMessage = "Email is required")]
[AssertThat("IsEmail(Email)",ErrorMessage="Valid email format required")]
public string Email { get; set; }
换句话说:在EditRecord控制器操作中,只有普通的DataAnnotation会触发,而不是我安装的ExpressiveAnnotations,它与条件注释配合得很好。添加和编辑操作都在同一个控制器中。当遍历代码时,两者都使用Overide SaveChanges(),Edit Action会在重写的最后一行中断并显示错误中的错误,但不会像Add View SaveChanges)那样在输入下显示ErrorMessage。
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
// Throw a new DbEntityValidationException with the improved exception message.
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
最后一行是编辑操作因错误而停止的地方:
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
我通过研究StackOverflow得到了上面的异常循环和覆盖,非常感谢,当电子邮件不符合有效格式时,它确实捕捉到了ExpressiveAnnotations错误,但它被死亡黄屏卡住了。在添加或拒绝记录后,我的添加操作不会阻塞并继续进行。
我希望我已经提供了足够的信息。我观察了这两种观点,它们几乎完全相同。
几个小时后
我想,在调用Actions时,可能我没有从视图中发送正确的模型。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditStoreAccount(int id, FormCollection formValues)
{
var accountToUpdate = _db.StoreAccounts.First(m => m.AccountID == id);
if (ModelState.IsValid)
{
//fill up accountToUpdate
_db.SaveChanges();
下面是我如何进行添加操作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddStoreAccount(StoreAccounts storeaccounts)
{
if (ModelState.IsValid) {
_db.StoreAccounts.Add(storeaccounts);
{
_db.SaveChanges();
哦,你会开枪打我的。也许不会。我试了一下,结果成功了。我的常规DataAnnotations用于编辑视图输入验证,如:[Required]、[StringLength]和[RegularExpression]。。。但不适用于像[RequiredIf]和[AssertThat]这样的ExpressiveAnnotations。
"添加"one_answers"编辑"的SaveChanges()重写相同,只是ModelState.IsValid没有为"编辑-保存"操作填充ExpressiveAnnotation错误。
所以。由于Add正在发送Model,我决定将Model添加到Edit操作中的参数中:。
添加
public ActionResult AddStoreAccount(StoreAccounts storeaccounts)
编辑
public ActionResult EditStoreAccount(int id, FormCollection formValues, StoreAccounts storeaccounts)
现在,我没有对即将到来的模型(StoreAccounts商店账户)做任何事情。MetaData类看到了它并填充了ModelState,因此IsValid为false。然后,它继续将错误消息放在输入下面,就像常规的DataAnnotations和没有YSOD一样。
哦,这是一个漫长而艰难的旅程来弄清楚MVC的东西。他们非常想让它像MS Access和/或Ruby LOL一样,但他们还没有完全实现。
我希望这10个小时的拔头发能帮助StackOverflow上的其他人。也许有人可以评论和解释发生了什么。请随时发表评论。我寻求启迪。如果有人想做出一个更简洁的答案来解释这个难题,我会很乐意选择他们的答案。