如何在MVC3自定义编辑器模板中获取属性名称

时间:2011-11-18 16:58:09

标签: asp.net-mvc-3 razor

我的项目中有一个枚举,我为这个枚举创建了一个自定义编辑器模板。所以,现在我对具有此枚举类型的属性的任何模型都将呈现下拉列表。

这很好用,但我想用我的下拉列表中的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>

所以,在我对select元素id和name属性有'PropertyNameHere'的地方,我希望得到我的模型属性的名称。这是一个例子:

我的模特:

    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 )

我希望我的select元素的名称和ID为'MyItemType'。

6 个答案:

答案 0 :(得分:56)

我在这里的一本书中找到了答案。实际上,它让我接近,但我可以根据我发现的东西谷歌休息。

以下是我需要添加到编辑器模板中的内容。

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

答案 1 :(得分:22)

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

使用这些,您可以执行类似

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

你会得到

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

此扩展类中还有其他几个相关帮助程序。但是,此方法不仅仅是获取属性名称。例如,您可以使用m.MyProperty.MySubProperty,您将获得一个有效的HTML名称进行发布。

答案 2 :(得分: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帮助程序。

答案 3 :(得分:2)

您可以通过

在编辑器模板中获取属性名称
@{
   string name = ViewData.ModelMetadata.PropertyName;
}

答案 4 :(得分:0)

如已接受的答案中所述,ViewData.TemplateInfo.HtmlFieldPrefix在EditorTemplate中为您提供属性名称。

我认为值得一提的是,如果您的目标是生成输入/选择,则可以在HtmlHelper函数内使用空字符串。它将使用模型的属性名称。

@Html.TextBox("", theValue, new { @class = "form-control" })

@Html.DropDownList("", new List<SelectListItem>(), theValue, new { @class = "form-control" })

答案 5 :(得分:-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>>