使用ModelMetadata获取完整的属性名称

zmb*_*mbq 13 c# asp.net-mvc

我正在尝试创建一个HtmlHelper,它将创建与Bootstrap兼容的表单字段.我的第一个目标是创建一个HtmlHelper来创建周围的div:

<div class="control-group"> ... </div>
Run Code Online (Sandbox Code Playgroud)

遵循这里的优秀建议,并在这里我设法让它相对快速地工作.但它并不总是奏效.

我有一个具有复杂属性的ViewModel,所以在我的表单中我访问该字段m=>m.Complex.Element.在我的助手中,我检查元素是否有验证错误.我用ModelMetadata.FromLambdaExpression(expression, html.ViewData).我得到的元数据有属性名称Element,而不是Complex.Element.

当我检查ModelState的这个属性时,我找不到它,因为ModelState保留了全名 - Complex.Element.

我可以寻找部分匹配,希望没有其他元素,但这似乎是一个令人讨厌的错误等待发生.如何从表达式中获取完整的属性名称?

zmb*_*mbq 29

MVC消息来源是公开的,这是一件好事.获取ModelState属性名称的正确方法是使用

var propertyName = ExpressionHelper.GetExpressionText(expression);
Run Code Online (Sandbox Code Playgroud)


Bet*_*tty 6

之前我已经使用以下内容来获取当前模型,但您可能必须将属性名称附加到此属性以获取该属性.

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;
Run Code Online (Sandbox Code Playgroud)

否则拉出反射器/ ilspy/whatever并检查你的EditorFor/TextBoxFor或编辑器所做的任何方法.