如何验证非模型属性?

时间:2012-05-04 13:27:55

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

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

@Html.TextBox("name", RunTimeValue)

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

5 个答案:

答案 0 :(得分:5)

如果启用了不显眼的验证,则可以通过执行此操作来作弊

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

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

答案 1 :(得分:0)

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

<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>

答案 2 :(得分:0)

你的约束在哪里?

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

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

答案 3 :(得分:0)

客户端,绑定jQuery.validate似乎最好。

服务器端,您需要查询相同的源来构建字段列表,然后查看每个字段的post变量,根据需要进行验证,并在失败时添加到一些不相关的摘要字符串。这不是MVC-ish。

更好:构建一个可以解释这个问题的模型,即使它是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上的服务器验证只是循环遍历模型,确保每个预期字段都存在,并且每个字段都通过验证。

答案 4 :(得分: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")}