2011-02-23 60 views
3

在我看来,我调用了Html.EditFor(),它触发了这种数据类型的自定义编辑器模板。此外,我通过一些元数据与它(这就是我不喜欢的部分):ModelMetaData:如何获得“父” - 元数据?

<% ModelMetadata metaTitle = ModelMetadataProviders.Current.GetMetadataForProperty(null, Model.GetType(), "Title"); %> 
<%: Html.EditorFor(x => Model.Title, new { metaData = metaTitle })%> 

传递类型(属性名称)的类型是“翻译”的。在自定义编辑器模板我要读从可视数据传递的元数据,以便使用它:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Translation>" %> 
// {...} 
if (ViewData["metaData"] != null) 
    metaData = (ModelMetadata)ViewData["metaData"]; 

是否有某种方式,我可以直接在自定义编辑模板内访问元数据?不幸的是,如果我叫编辑模板内的以下,我不会得到相同的元数据对象(其中,例如,如果标题 - 物业需要与否的信息丢失):

ModelMetadata metaData = ModelMetadataProviders.Current.GetMetadataForType(null, Model.GetType()); 

我想要避免在每次调用时传递元数据对象...

Thx for any tipps! sl3dg3

回答

7

我想你想获得的EditorTemplate实际属性的元数据。

你可以这样做这样的(在EditorTemplate内):

var metadata = ModelMetadata.FromStringExpression("", ViewData); 

“” 是指MVC当前属性。

+0

你是对的,那正是我在寻找的 - 最后我可以验证它。 – sl3dg3 2012-05-25 07:40:58

+0

+1 - 尼斯发现...这个API非常强大但不直观。 – 2012-08-19 04:24:49

5

你可以尝试以下操作来访问父元:

<% 
    var parentType = this.ViewData.ModelMetadata.ContainerType; 
    var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, parentType); 
%> 
+0

好一点 - 但我现在的元数据父视图模型(好的,我的标题可能是误导性的)。但我想拥有'ParentModel.Title'的元数据 - 这里唯一的问题是我不知道编辑器模板中属性的名称... – sl3dg3 2011-02-23 11:24:17

+0

@ sl3dg3,如果您不知道名称编辑器模板内的属性你期望如何获得它的价值? – 2011-02-23 11:52:09

0

诚然有点迟到了,但是还有一个更简单的方式来获得当前模型的模型元数据 - 它的存在为property of ViewData

var metadata = ViewData.ModelMetadata;