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