我的项目中有一个枚举,我为这个枚举创建了一个自定义编辑器模板。所以,现在我对具有此枚举类型的属性的任何模型都将呈现下拉列表。
这很好用,但我想用我的下拉列表中的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'。
答案 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>>