Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何验证非模型属性?_Asp.net Mvc_Asp.net Mvc 3_Validation - Fatal编程技术网

Asp.net mvc 如何验证非模型属性?

Asp.net mvc 如何验证非模型属性?,asp.net-mvc,asp.net-mvc-3,validation,Asp.net Mvc,Asp.net Mvc 3,Validation,在我的应用程序中,我基于运行时数据动态呈现UI。有一个模型,但它没有编译的属性。相反,我正在检查一个数据库并使用以下帮助程序呈现多个字段: @Html.TextBox("name", RunTimeValue) 现在我想在这些字段中包括验证,但我不知道如何做。自定义元数据提供程序似乎不起作用,因为这仍然要求模型具有属性,而提供程序提供属性。但我的模型属性在运行时之前根本不存在。出于这个原因,我也不能使用,例如,EditorFor。那么,如何将验证(客户端和服务器)注入到这种情况中呢?您可以使用

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

@Html.TextBox("name", RunTimeValue)

现在我想在这些字段中包括验证,但我不知道如何做。自定义元数据提供程序似乎不起作用,因为这仍然要求模型具有属性,而提供程序提供属性。但我的模型属性在运行时之前根本不存在。出于这个原因,我也不能使用,例如,
EditorFor
。那么,如何将验证(客户端和服务器)注入到这种情况中呢?

您可以使用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>

$(文档).ready(函数(){
$(“表格”)。验证({
规则:{
名称:“必需”
}
});
}); 

您的约束条件在哪里

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


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

如果启用了非结构化验证,则可以通过这样做进行欺骗

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

其他可能的数据val值包括data val regex(带有data val regex模式)、data val range(带有data val range min和data val range max)、data val number和一些我没有使用过的其他值。

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

在服务器端,您需要查询同一个源来构造字段列表,然后查看每个字段的post变量,根据需要进行验证,如果失败,则添加到一些不相关的摘要字符串。这不太符合MVC标准

更好:构建一些模型来解释这一点,即使MyFields是IEnumerable:

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上的服务器验证只是在模型中循环,以确保每个预期字段都存在,并且每个字段都通过了验证

  • 确保已启用非结构化验证
  • 通过添加这些值来更改控件,如示例所示

    @Html.TextBox(“name”,RunTimeValue,新字典{{{“data val”,“true”},{“data val required”,“name is required”})

  • 将这一行添加到控件的后面

    @Html.ValidationMessage(“name”,new{@class=“text danger”})

  • 确保包含JQuery验证资源

    @sectionscripts{@Scripts.Render(“~/bundles/jqueryval”)}


  • 这些约束是标准的,比如长度或IsRequired,我很乐意根据应用程序中的配置数据在视图中发出这些约束。我的问题纯粹是关于实现的:在我的示例中,如果我知道我想要一个字段具有一定的长度、是必需的,等等,那么如何将验证附加到TextBox帮助器调用。我知道我可以完全手动构建html属性,并调用TextBox重载来包含这些属性,但我正在尝试连接到现有系统中,这样我就不必手动完成所有这些操作(毫无疑问会引入错误)。换句话说,我正在寻找类似WebForms验证的东西,您在表单上插入一个RequiredFieldValidator,并告诉它正在验证哪个字段,只是我想留在MVC范例中,让MVC为我工作。@JoshuaFrank您如何构建
    RunTimeValue
    ?如果您在运行时使用反射卷起一个新类,那么您可以在构建类时轻松地将
    DataAnnotations
    属性应用于类的属性,它将使用所有的魔法。我不确定您的意思。我的类表示数据库中的一个表。同一类用于系统中的所有表。在运行时,我为系统中的每个表创建一个表对象,并通过指定列(Id、Name、Salary等)对其进行配置,但这些不是表对象的属性,而是在运行时添加的。同样在运行时,我为给定的表生成一个编辑屏幕,并为表中的每一列发出一个字段。每个字段只是一个输入元素,但其中一些是必需的(非空),一些是特定的数据类型(整数),等等。续:所以问题是:对于每个字段,我知道验证规则是什么,但我不知道如何使用适当的验证修饰呈现相应的输入字段。对,但是我必须做所有的工作来填充这些值。我正在尝试连接到MVC逻辑,这样它就可以为我完成这项工作。而且这也不能处理服务器端验证。@NickLarsen:这也是事实,所以我也必须手动完成。Jeow Li Huan:最后,你的建议没有那么难,所以我这样做了,使用一些助手方法,这样我就可以像使用内置方法一样轻松地重用验证。还有@NickLarsen,我也必须构建服务器验证。很烦人,但最终比我的脑袋在这个问题上挣扎的时间要长得多。