【问题标题】:TryUpdateModel validating fields not in the includePropertiesTryUpdateModel 验证不在 includeProperties 中的字段
【发布时间】:2015-06-10 17:10:41
【问题描述】:

我正在尝试使用 TryUpdateModel 在 MVC 控制器的数据库中保存几个字段。但是,它一直返回 false,因为它正在验证电子邮件地址和电话号码的格式无效。有字段是空白或空的。在 TryUpdateModel 方法中,我指定了包含哪些字段,而这些字段不是其中之一。我不确定为什么它在包含的属性之外进行验证?

Guid EmailGuid = new Guid(emailguidparam);
MyModelobject MyList= db.MyLists.FirstOrDefault(p => p.ReceiptGuid == EmailGuid);


var currentUsername = User.Identity.Name != null
                ? User.Identity.Name
                : "Anonymous";
MyList.Field1= true;
MyList.Field2= currentUsername;
MyList.Field3= DateTime.Now;

 success = TryUpdateModel(MyList, includeProperties: new string[] { "field1", "field2", "field3" });
       if(success){
            db.SaveChanges();
            return RedirectToAction("AnotherActionController", new { success = false, message = "Thanks." });
       }

success 总是错误的,因为它正在验证我指定的其他字段。任何人都知道如何解决此问题或为什么要验证其他字段?

【问题讨论】:

  • includeProperties 表示它只会设置列表中属性的值。您可能在另一个属性上具有(比如说)[Required] 属性这一事实仍然意味着该模型将无效。您应该使用仅包含所需属性的视图模型,然后在 POST 方法中,获取数据模型,然后在保存数据模型之前将视图模型属性映射到数据模型。
  • 这是一种确认链接,用户可以点击它来确认用户收到了一封电子邮件。有没有更安全的方法来做到这一点? @StephenMuecke
  • 您需要为MyModelobject 显示您的模型(包括验证属性)(目前尚不清楚是什么属性导致ModelState 无效)
  • 电话和电子邮件字段无效,因为它正在验证一个空字符串。有没有比我上面尝试的更好的方法?我认为有一个 ModelState.Remove() 可以取出违规字段?这还推荐吗? @StephenMuecke
  • 这不会有帮助,因为你只在TryUpdateModel() 之后调用它来删除ModelState 错误(到那时success 的值已经是false)。但是为什么只将这些属性包含在includeProperties 列表中呢?

标签: asp.net-mvc linq entity-framework


【解决方案1】:

我想我知道我的场景出了什么问题,除了缺乏对 MVC 和实体框架的完整理解之外。它正在验证的字段有一个空字符串。即使,字符串是空的;它仍然得到验证。为了不让模型验证这些字符串(有效的电话和/或电子邮件地址),这些字符串必须为 NULL。在调用 TryUpdateModel 之前,我检查了 String.Empty 的字段,然后将其设置为 NULL。部分问题是模型从中提取的表由 sql 存储过程填充。因此,数据在写入时超出了 MVC 的范围。

对我来说,第 101 课是模型在空字符串上验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多