Как я могу получить имя свойства в моем шаблоне редактора MVC3? - PullRequest
33 голосов
/ 18 ноября 2011

У меня есть перечисление в моем проекте, и я создал собственный шаблон редактора для этого перечисления. Итак, теперь любая модель, имеющая свойство со значением перечисления, будет отображать выпадающий список.

Это прекрасно работает, но я бы хотел назвать свой элемент 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 для атрибутов идентификатора и имени выбранных элементов, я хотел бы иметь имя свойства моей модели. Вот пример:

Моя модель:

    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 было имя и идентификатор 'MyItemType'.

Ответы [ 5 ]

57 голосов
/ 18 ноября 2011

Я нашел ответ в моей книге. На самом деле, это сблизило меня, но тогда я мог погуглить остальное, основываясь на том, что нашел.

Вот что мне нужно было добавить в мой шаблон редактора.

@{var fieldName = ViewData.TemplateInfo.HtmlFieldPrefix;}
<select id="@fieldName" name="@fieldName"> 
22 голосов
/ 15 июня 2014

Для дальнейшего использования (старый вопрос) я нашел это: System.Web.Mvc.Html.NameExtensions.

Используя их, вы можете сделать что-то вроде

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

И вы

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

В этом расширенном классе есть несколько других связанных помощников.Этот метод делает больше, чем просто получает имя свойства.Например, вы можете использовать m.MyProperty.MySubProperty и получить правильное имя HTML для публикации.

4 голосов
/ 18 ноября 2011

Как насчет следующего шаблона:

@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.

2 голосов
/ 04 августа 2016

Вы можете получить имя свойства в шаблоне редактора через

@{
   string name = ViewData.ModelMetadata.PropertyName;
}
0 голосов
/ 18 ноября 2011

Вы можете создать помощника, чтобы использовать его внутри своего представления, что объясняется здесь

И вы можете использовать этот кусок кода, чтобы получить имя.

 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>>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...