3

在我的应用程序中,我根据运行时数据动态呈现 UI。有一个模型,但它没有编译的属性。相反,我正在检查数据库并使用这样的帮助器呈现多个字段:

@Html.TextBox("name", RunTimeValue)

现在我想对这些字段进行验证,但我不知道该怎么做。自定义 MetadataProvider 似乎不起作用,因为它仍然希望模型具有属性,而提供者提供属性。但是我的模型属性直到运行时才存在。我也不能使用,例如,EditorFor出于这个原因。那么如何在这种情况下注入验证(客户端和服务器)?

4

5 回答 5

6

如果您启用了不显眼的验证,您可以通过这样做来作弊

@Html.TextBox("name", RunTimeValue, new Dictionary<string, object> { { "data-val", "true" }, { "data-val-required", "The name is required" } })

开箱即用的其他可能的 data-val 值是 data-val-regex(带有 data-val-regex-pattern)、data-val-range(带有 data-val-range-min 和 data-val-range-max )、data-val-number 和其他一些我没用过的。

于 2012-05-04T14:28:22.753 回答
0

您可以使用 JQuery 验证方法客户端验证,如下所示:

<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js"></script>
<script type="text/javascript">
      $(document).ready(function () {
          $("form").validate({
              rules: {
                  name: "required"
              }
          });
      }); 
 </script>
于 2012-05-04T13:38:23.300 回答
0

你的限制在哪里?

数据库本身的约束,比如字符串的最大长度,是否为空等?在这种情况下,您可以从 db 中加载列类型并构建从中生成验证的工具。如果您根据请求生成模型,您还可以在运行时生成验证属性。您可能必须首先加载模型 + 约束,编写自己的绑定逻辑以使用提交的值更新模型,然后对其运行验证。

您的代码中有约束吗?如果是这种情况,您只需将运行时加载的字段映射到您的代码约束。

于 2012-05-04T13:38:48.840 回答
0

在客户端,装配 jQuery.validate 似乎是最好的。

在服务器端,您需要查询相同的源以构造字段列表,然后查看每个字段的发布变量,根据需要进行验证,并在失败时添加一些不相关的摘要字符串。这不是非常 MVC 风格。

更好:建立一些模型来解释这一点,即使它是 IEnumerable ,其中 MyFields 是:

public class MyFields {
    public string Name { get; set; }
    public string Value { get; set; }
    public string ErrorMessage { get; set; }
    // TODO: Add fields for validation expectations: required, string length, etc
    // TODO: Maybe consider adding fields to specify the control needed: checkbox, select, etc
}

如果您有这样的模型,则 post 上的服务器验证只是循环通过模型,确保每个预期字段都存在并且每个字段都通过验证。

于 2012-05-05T19:50:41.940 回答
0
  1. 确保您启用了不显眼的验证
  2. 通过添加这些值来更改您的控件,例如示例

    @Html.TextBox("name", RunTimeValue, new Dictionary<string, object> { { "data-val", "true" }, { "data-val-required", "The name is required" } })

  3. 在您的控件之后添加此行

    @Html.ValidationMessage("name", "", new { @class = "text-danger" })

  4. 确保包含 JQuery 验证资源

    @section Scripts {@Scripts.Render("~/bundles/jqueryval")}

于 2016-12-23T22:46:45.490 回答