我试图解决这样一个事实,即当他们编写 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/