如何使用Html.GetUnobtrusiveValidationAttributes()

我试图解决这样一个事实:当他们编写asp.net MVC 3时,他们忘记包含代码来添加不显眼的validation属性到选择列表,他们的“修复”就是将它包含在MVC 4中,这不是血腥的使用MVC 3的任何人。

我提议的工作是使用Html.GetUnobtrusiveValidationAttributes()来自己添加它们,就像任何其他自定义属性一样,但我无法确定调用该方法的正确语法。 有2个重载,一个接受一个字符串,另一个接受一个字符串和一个ModelMetaData类。 我理解元数据参数,我认为我只是传入ViewData.ModelMetadata但该字符串应该是什么? MSDN文档说它是“指定的HTML名称属性”,这对我来说毫无意义。 HTML名称属性是什么? 选择清单? 为什么它需要它,以及它如何帮助它知道我的模型上我想要validation的属性? 查看使用示例,他们似乎都在我的模型上的属性名称中传递,我想要validation属性,这是有道理的。 不幸的是,无论我传递什么,我都无法让方法返回任何空集合。

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

 public class EventViewModel { public Model.Event NewEvent { get; set; } public IEnumerable 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然后validation“正常工作”,除了将validation属性添加到我的模型类之外我不必做任何事情。

编辑:

只是尝试关闭客户端validation,validation在所有选择列表的服务器端工作正常。

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

 public static IDictionary UnobtrusiveValidationAttributesFor(this HtmlHelper html, Expression> 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); 

你可以内联使用它

选择元素的示例

  

这是我发布的答案的链接,显示我写的HtmlHelper为下拉列表提供不显眼的validation: MVC 3下拉列表validation不适用于复杂的视图模型

UPDATE

您是在尝试在HtmlHelper中获取属性,还是在视图中内嵌?

假设您正在尝试获取视图中的属性,那就是问题所在。

首先,您需要了解ModelMetadata并不代表整个模型中可用的单个对象。 相反,它代表特定元素的元数据,无论是您的模型,还是模型中的任何属性。 更好的描述性名称是ObjectMetadata ,因为ModelMetadata是指定对象的元数据,无论是模型,嵌套模型还是特定属性。

视图中的ModelMetadata只是顶级模型的元数据。 您必须获取下拉列表绑定到的属性的ModelMetadata。 如果您使用帮助程序,那么帮助程序将传递正确的ModelMetadata。 如果你使用你的视图,你需要参加一些体操来获得正确的ModelMetadata,例如,请参阅我的答案: 在Asp.net MVC 3中validation和编辑“可更改”/可选类型