ExpressiveAnnotations适用于添加视图,但不适用于编辑视图MVC 5

时间:2015-11-29 06:47:51

标签: asp.net-mvc asp.net-mvc-5 savechanges expressiveannotations

在我的metadata.cs文件中,这适用于我在AddRecord Controller Action中点击_db.SaveChanges()的时候。 " [AssertThat("适用于Add SaveChanges(),但不适用于Edit SaveChanges())。 " [必需]"适用于两者。 " SSS"不会传递Add SaveChanges(),它会传递Edit SaveChanges()。

[Required(ErrorMessage = "Email is required")]
[AssertThat("IsEmail(Email)",ErrorMessage="Valid email format required")]
public string Email { get; set; }

换句话说: 在EditRecord Controller Action中,只有普通的DataAnnotation触发,而不是我安装的ExpressiveAnnotations,并且条件注释工作得非常好。添加和编辑操作都在同一个控制器中。并且在单步执行代码时都使用Overide SaveChanges(),编辑操作在覆盖的最后一行中断,并显示错误中的错误,但不会在输入下显示ErrorMessage,如Add View SaveChanges()确实

   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错误,但它与黄色死亡屏幕窒息。在添加或拒绝记录后,我的添加操作不会窒息并继续。

我希望我已经提供了足够的信息。我查看了两个视图,它们几乎相同。

几小时后

我想也许我在调用动作时没有从视图中发送正确的模型。

[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();

1 个答案:

答案 0 :(得分:0)

哦,你会开枪打死我的。也许不吧。我尝试了一些东西,但它有效。 我的常规DataAnnotations适用于Edit View输入验证,如:[Required],[StringLength]和[RegularExpression]。 ...但不适用于[RequiredIf]和[AssertThat]等ExpressiveAnnotations。

“添加”和“编辑”的SaveChanges()覆盖相同,只是ModelState.IsValid没有为“编辑保存”操作填充ExpressiveAnnotation错误。

因此。 。 。由于Add在模型中发送,我决定将模型添加到Edit操作中的参数:。

添加

public ActionResult AddStoreAccount(StoreAccounts storeaccounts)

修改

public ActionResult EditStoreAccount(int id, FormCollection formValues, StoreAccounts storeaccounts)

现在,我没有使用模型进入nuthin(StoreAccounts storeaccounts)。 MetaData类看到它并填充ModelState,因此IsValid为false。然后它继续将错误消息放在输入下面,就像常规的DataAnnotations和没有YSOD一样。

哦,这是一个漫长的艰难旅程,想出这个MVC的东西。他们想要像MS Access和/或Ruby LOL那样糟糕,但他们还没有到达那里。

我希望这10小时的拔毛能帮助其他人在StackOverflow上工作。也许有人可以评论和解释发生的事情。请随意发表评论。我寻求启蒙。如果有人想要一个更简洁的答案来解释这个难题,我很乐意选择他们的答案。