Подтвердить что ты не робот

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

Моя модель:

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Для справки в будущем (старый вопрос) я нашел это: System.Web.Mvc.Html.NameExtensions.

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

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

И вы получите

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

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

Ответ 3

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

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

Ответ 4

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

@{
   string name = ViewData.ModelMetadata.PropertyName;
}

Ответ 5

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

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

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