在我的应用程序中,我基于运行时数据动态呈现UI。有一个模型,但它没有编译属性。相反,我正在检查数据库并使用这样的帮助器渲染多个字段:
@Html.TextBox("name", RunTimeValue)
现在我想在这些字段中包含验证,但我看不出如何做到这一点。自定义MetadataProvider似乎不起作用,因为这仍然期望模型具有属性,而提供者提供属性。但是我的模型属性直到运行时才存在。出于这个原因,我也不能使用例如EditorFor
。那么如何在这种情况下注入验证(客户端和服务器)呢?
答案 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)
通过添加像示例
这样的值来更改您的控件 @Html.TextBox("name", RunTimeValue, new Dictionary<string, object> { { "data-val", "true" }, { "data-val-required", "The name is required" } })
在您的控件后立即添加此行
@Html.ValidationMessage("name", "", new { @class = "text-danger" })
确保包含JQuery验证资源
@section Scripts {@Scripts.Render("~/bundles/jqueryval")}