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

Jef*_*ddy 34 razor asp.net-mvc-3

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

这很好用,但我想用我的下拉列表中的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>
Run Code Online (Sandbox Code Playgroud)

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

我的型号:

    public class MyModel{
        public int ItemID {get;set;}
        public string ItemName {get;set;}
        public ItemEnumerations.ItemType MyItemType {get;set;}
    }
Run Code Online (Sandbox Code Playgroud)

我的观点代码:

@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 )
Run Code Online (Sandbox Code Playgroud)

我希望我的select元素的名称和id为'MyItemType'.

Jef*_*ddy 58

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

这是我需要添加到编辑器模板的内容.

@{var fieldName = ViewData.TemplateInfo.HtmlFieldPrefix;}
<select id="@fieldName" name="@fieldName"> 
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用编辑器的默认模板,您还可以通过`ViewData.ModelMetadata.PropertyName`获取名称.但是,使用您提出的解决方案可以使用默认模板或指定模板名称(即`@ Html.EditorFor(m => m.ItemName,"templatename")`). (3认同)
  • tks Jeff,在此之后我发现方法GetFullHtmlFieldName()... ViewData.TemplateInfo.GetFullHtmlFieldName("field") (2认同)

Tod*_*odd 23

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

使用这些,你可以做类似的事情

<input type=text" name="@Html.NameFor(m => m.MyProperty)">
Run Code Online (Sandbox Code Playgroud)

你会得到的

<input type=text" name="MyProperty">
Run Code Online (Sandbox Code Playgroud)

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

  • 很高兴知道。但它并没有回答这个问题,因为您仍然需要知道名称“MyProperty”才能使用它。但是,如果您调用“EditorFor(m =&gt; m.MyProperty)”,并且在编辑器模板中您想要找出它所调用的名称是“MyProperty”,则这没有帮助。 (2认同)