2011-11-18 36 views
27

我在我的项目中有一个枚举,并且为此枚举创建了一个自定义编辑器模板。所以,现在我有一个属性与这种枚举类型的任何模型,将呈现一个下拉。如何在我的MVC3自定义编辑器模板中获取属性名称

这很好,但我想用属性的名称命名我的下拉列表中的select元素。这是我的编辑器模板的Razor代码。

@model ItemEnumerations.ItemType 

    <select id="PropertyNameHere" name="PropertyNameHere"> 
    @foreach (ItemEnumerations.ItemType in Enum.GetValues(typeof(ItemEnumerations.ItemType))) { 
     <option value="@value" @(Model == @value ? "selected=\"selected\"" : "")>@value.ToString()</option>   
    } 
    </select> 

所以,在这里我有“PropertyNameHere”为选择元素id和name属性,我想有我的模型的属性的名称。这里有一个例子:

我的模型:

public class MyModel{ 
     public int ItemID {get;set;} 
     public string ItemName {get;set;} 
     public ItemEnumerations.ItemType MyItemType {get;set;} 
    } 

我查看代码:

@model MyModel 

@Html.LabelFor(m => model.ItemID) 
@Html.DisplayForm(m => model.ItemID) 

@Html.LabelFor(m => model.ItemName) 
@Html.EditorFor(m => model.ItemName) 

@Html.LabelFor(m => model.MyItemType) 
@Html.EditorFor(m => model.MyItemType) 

我想我的选择元素有 'MyItemType' 的名称和ID。

+0

在编辑器模板获得属性的名称也许更好的解决办法是延长DropDownFor方法来处理我的枚举? –

+0

试试这个...http://blog.nathan-taylor.net/2012/10/aspnet-mvc-get-field-name-and-id-for.html –

回答

51

我发现了一本书,我这里有答案。事实上,它让我感觉很亲密,但是我可以根据我发现的情况来搜索其他人。

这是我需要添加到我的编辑模板。

@{var fieldName = ViewData.TemplateInfo.HtmlFieldPrefix;} 
<select id="@fieldName" name="@fieldName"> 
+2

tks杰夫,在这之后,我发现了方法GetFullHtmlFieldName()... ViewData.TemplateInfo.GetFullHtmlFieldName(“field”) – Gadonski

+3

如果您使用编辑器的默认模板,您也可以通过'ViewData.ModelMetadata .PropertyName'。但是,使用您提出的解决方案使用默认模板或指定模板名称(即'@ Html.EditorFor(m => m.ItemName,“templatename”)')。 –

-1

您可以创建一个帮手来使用你的观点,这说明here

你可以使用这段代码来获取名称里面。

public static class GenericHelper<T> 
{ 
    public static String GetPropertyName<TValue>(Expression<Func<T, TValue>> propertyId) 
    { 
     var operant = (MemberExpression)((UnaryExpression)propertyId.Body).Operand; 
     return operant.Member.Name; 
    } 
} 

我认为缺省的助手做同样的,如HiddenFor,因为他们也使用Expression<Func<TModel, TProperty>>

+0

我希望通过一些元数据获取属性名称。我想尽可能通用。 –

+0

使用Expression <>确实保持它的通用性? 在您的视图中,您将使用@Http.YourHelper(m => model.ItemID),其中您的助手从代码片段 –

+0

中返回GetPropertyName,请参阅我对@Todd的评论,此处也适用。 – chiccodoro

4

如何下面的模板:

@model ItemEnumerations.ItemType 
@{ 
    var values = 
     from value in Enum.GetValues(typeof(ItemType)).Cast<ItemType>() 
     select new { ID = (int)value, Name = value.ToString() }; 
    var list = new SelectList(values , "ID", "Name", (int)Model); 
} 
@Html.DropDownList("", list) 

这样,您就不需要手动渲染<select><option>标签和你重用现有DropDownList帮手。

+0

这与我的代码一起工作(请参阅我对此问题的回答),但我放弃了解决方案。我喜欢使用现有的帮手。再次感谢Darin。 –

19

为了将来的参考(老问题),我发现这个:System.Web.Mvc.Html.NameExtensions。

使用这些,你可以这样做

<input type=text" name="@Html.NameFor(m => m.MyProperty)"> 

,你会得到

<input type=text" name="MyProperty"> 

有在此扩展类其他几个相关的帮手。不过,这种方法不仅仅是获取属性名称。例如,你可以使用m.MyProperty.MySubProperty,你会得到一个有效的HTML名称来发布。

+1

很高兴知道。尽管如此,它仍然没有回答这个问题,因为您仍然需要知道名称MyProperty才能使用它。但是如果你调用'EditorFor(m => m.MyProperty)'并且在Editor模板中你想知道它被调用的名字是'MyProperty',这没有帮助。 – chiccodoro

+0

这解决了我获取嵌套属性名称的问题。 – jahu

2

您可以通过

@{ 
    string name = ViewData.ModelMetadata.PropertyName; 
} 
相关问题