【问题标题】:MVC 3 Razor - Unobtrusive Validation Not WorkingMVC 3 Razor - 不显眼的验证不起作用
【发布时间】:2011-03-30 14:27:40
【问题描述】:

谁能看到为什么我的验证不起作用?目前它只是在插入时发布并失败,因为数据插入不允许空值,而不是在客户端捕获它并显示所需的字段消息。

查看
http://pastebin.com/4grwD02i

控制器
http://pastebin.com/jdbYk8tR

布局
http://pastebin.com/AbQ9xYLG

应用设置

  <appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

~~更新~~

型号
http://pastebin.com/FJkPgKsX

我只是为我的 DAL 使用 Linq to SQL DBML 文件,所以我没有对属性进行任何装饰。我可以这样做并仍然使用 DBML 吗?

【问题讨论】:

    标签: asp.net-mvc-3 unobtrusive-validation


    【解决方案1】:

    默认模型绑定器依赖数据注释来执行验证。因此,如果您的模型属性没有任何属性来指示如何执行验证,它将始终被认为是有效的(例如,当您尝试将无效格式绑定到 DateTimeint 字段时默认模型绑定器会自动将模型状态标记为无效)。

    【讨论】:

    • 我无法在分部类中进行数据注释而不会出现错误:“Yes.Models.MobileCarrier”类型已经包含“名称”的定义
    • @EdenMachine,您可以使用[MetaDataType] 属性将验证外部化到一个单独的类中。见这篇文章:asp.net/mvc/tutorials/…
    【解决方案2】:

    我没有看到您的任何操作方法检查模型状态是否有效。无论页面上的验证是否有效,您的操作方法都会执行。要检查您的所有验证是否已通过,请检查 ModelState.IsValid 属性。

    Is ModelState.IsValid 为 false,则不要对您的数据存储执行任何操作。大多数人只是像以前一样渲染相同的视图,助手将完成他们的工作,即放入用户数据并显示验证。

    编辑: 查看您的帖子后,您可能希望该帖子永远不会发生,因为您正在尝试使用客户端验证。我对这部分验证没有太多经验,但即使你想使用它,你也不应该完全依赖它,而总是依赖服务器为你做验证(客户端验证应该主要是为了更好的用户体验)。

    我不确定您的模型是什么样的,但我假设您已经使用 System.ComponentModel 命名空间中的属性修饰了各种属性和/或字段,对吗?

    【讨论】:

    • 我更新了我的帖子来回答你的问题。 (并且随时指出我正在做的任何其他愚蠢的事情 - 我对 MVC 完全陌生。这是我第一次尝试。)
    • 我在控制器插入代码周围添加了 ModelState.IsValid,它返回为 true
    • 看起来@Darin 让您走上了正确的道路,一旦您查看MetaDataTypeAttribute,应该更清楚该做什么。但我会警告您不要将请求数据绑定到持久保存到数据库的模型。如果有人足够了解您的模型,他们可以格式化请求,以便它绑定您从未希望他们能够绑定的属性(例如主键)。大多数人改用视图模型,它是您必须将数据转换成的额外层,但允许您定义适合各种视图的确切需求的模型。
    猜你喜欢
    • 2012-06-18
    • 2018-11-06
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多