我正在尝试创建一个HtmlHelper,它将创建与Bootstrap兼容的表单字段。我的第一个目标是创建一个HtmlHelper来创建周围的div:
<div class="control-group"> ... </div>遵循这里和这里的极好的建议,我设法让它相对较快地工作。但它并不总是有效的。
我有一个具有复杂属性的ViewModel,因此在我的表单中我访问字段m=>m.Complex.Element。在我的帮助器中,我检查元素是否存在验证错误。我使用ModelMetadata.FromLambdaExpression(expression, html.ViewData)。我得到的元数据的属性名为Element,而不是Complex.Element。
当我检查这个属性的ModelState时,我找不到它,因为ModelState保留了全名- Complex.Element。
我可以寻找部分匹配,希望没有其他元素,但这似乎是一个等待发生的令人讨厌的bug。如何从表达式中获取完整的属性名称?
发布于 2012-10-07 14:12:33
MVC源代码是公开的,这是一件好事。获取ModelState属性名的正确方法是使用
var propertyName = ExpressionHelper.GetExpressionText(expression);发布于 2012-10-07 08:19:51
我以前使用过以下代码来获取当前模型的属性,您可能需要将属性名称附加到该属性中才能获得该属性。
ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;否则,拉出反射器/ilspy/任何东西,并检查您的EditorFor/TextBoxFor或呈现编辑器的任何方法所做的事情。
发布于 2013-09-12 19:42:53
对于我需要的属性,我使用了这两个答案的组合。总而言之,这两个答案都提供了一个我可以在视图和嵌套编辑器模板中使用的工作属性。下面是我的例子:
public static MvcHtmlString HasErrorClassFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression)
{
string expressionText = ExpressionHelper.GetExpressionText(expression);
string htmlFieldPrefix = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix;
string fullyQualifiedName;
if (htmlFieldPrefix.Length > 0)
{
fullyQualifiedName = string.Join(".", htmlFieldPrefix, expressionText);
}
else
{
fullyQualifiedName = expressionText;
}
bool isValid = htmlHelper.ViewData.ModelState.IsValidField(fullyQualifiedName);
if (!isValid)
{
return MvcHtmlString.Create("has-error");
}
return MvcHtmlString.Empty;
}https://stackoverflow.com/questions/12764890
复制相似问题