c# - 如何使用 Html.GetUnobtrusiveValidationAttributes()

标签 c# asp.net-mvc asp.net-mvc-3 unobtrusive-validation

我试图解决这样一个事实,即当他们编写 asp.net MVC 3 时,他们忘记包含代码以将不显眼的验证属性添加到选择列表及其 "fix"因为这是将它包含在 MVC 4 中,这对使用 MVC 3 的任何人来说都没有血腥的用途。

我建议的解决方法是使用 Html.GetUnobtrusiveValidationAttributes() 自己添加它们,就像任何其他自定义属性一样,但我无法计算出调用该方法的正确语法。有 2 个重载,一个接受一个字符串,另一个接受一个字符串和一个 ModelMetaData 类。我了解元数据参数,我想我只是传入 ViewData.ModelMetadata 但字符串应该是什么? MSDN 文档说它是“指定的 HTML 名称属性”,这对我来说毫无意义。什么是 HTML name 属性?选择列表?为什么它需要它,这如何帮助它知道我想要验证模型的哪些属性?查看使用示例,它们似乎都传递了我想要验证属性的模型属性的名称,这是有道理的。不幸的是,无论我传入什么,我都无法获得返回空集合以外的任何东西的方法。

我的模型类称为 Event,我的属性称为 EventTypeID。我使用稍微不同的 viewmodel 类作为 View 的基础,因为我需要显示事件列表,还允许在同一 View 上输入新事件,所以我有一个简单的 viewmodel 类,如下所示:

public class EventViewModel
{
    public Model.Event NewEvent { get; set; }
    public IEnumerable<Model.Event> Events { get; set; }
}

下拉列表映射到如下属性:@Html.DropDownListFor(model => model.NewEvent.EventTypeID 我将什么作为字符串传递给 Html.GetUnobtrusiveValidationAttributes(string) Html.GetUnobtrusiveValidationAttributes(string, ModelMetadata) 获取此属性的属性。我试过:

Html.GetUnobtrusiveValidationAttributes("EventTypeID")
Html.GetUnobtrusiveValidationAttributes("EventTypeID",ViewData.ModelMetadata)
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID")
Html.GetUnobtrusiveValidationAttributes("NewEvent.EventTypeID",ModelMetadata)

它们都返回一个空集合。

我知道我的模型是正确的,因为如果我将调用从 Html.DropDownListFor 更改为 Html.TextBoxFor 然后验证“正常工作”而无需我做除了将验证属性添加到我的模型类之外的任何其他内容。

编辑:

刚刚尝试关闭客户端验证,所有选择列表的服务器端验证工作正常。

最佳答案

对于那些仍在寻找答案的人,这对我有用:

public static IDictionary<string, object> UnobtrusiveValidationAttributesFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> propertyExpression)
{
    var propertyName = html.NameFor(propertyExpression).ToString();
    var metadata = ModelMetadata.FromLambdaExpression(propertyExpression, html.ViewData);
    var attributes = html.GetUnobtrusiveValidationAttributes(propertyName, metadata);
    return attributes;
}

请注意,我使用的是 .Net MVC 4,您在 MVC 3 中没有 html.NameFor 方法。但是,我相信这可以在 MVC 3 中使用以下方法完成:

var propertyName = ExpressionHelper.GetExpressionText(propertyExpression);

关于c# - 如何使用 Html.GetUnobtrusiveValidationAttributes(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8239929/

相关文章:

c# - 从 POST 发回请求

c# - Windows 窗体加载然后退出

c# - 我们如何让 ReSharper Test Runner 9.2 以 .Net 4.6 为目标,使其默认支持 TLS 1.2?

c# - ASP.Net MVC SQL 格式化 HTML

mysql - ASP.NET - 无效的对象名称 'dbo.ForumSections'

asp.net - 动态修改web.config文件有什么问题吗

asp.net-mvc-3 - 将表单数据传递给 Controller ​​ mvc3

c# - StreamWriter 打开时修改日期不会更新

c# - 使用部分类型信息结束异步委托(delegate)调用

c# - .NET c# - 自定义显示属性