У меня есть шаблон редактора, работа которого заключается в том, чтобы взять SelectList
в качестве модели и построить элемент select
в html, используя вспомогательное расширение Html.DropDownList()
.
Я пытаюсь назначитьname
атрибут для select
на основе свойства ModelMetadata
.(Причина: при постбэк мне нужно привязать к объекту с другим именем свойства для этого элемента, чем ViewModel, используемый для заполнения формы.)
Проблема, с которой я столкнулся, заключается в том, что DropDownList()
- это добавление имени, которое я предоставляю вместо , заменяющего его, поэтому я получаю имена типа categories.category
вместо category
.
Здеськод для просмотра ...
SelectList.ascx
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Web.Mvc.SelectList>" %>
<%= Html.DropDownList(
(string)ViewData.ModelMetadata.AdditionalValues["PropertyName"], Model) %>
Результирующий HTML
<select id="SkillLevels_SkillLevel" name="SkillLevels.SkillLevel">
<option value="1">High</option>
<option value="2">Med</option>
<option selected="selected" value="3">Low</option>
</select>
Ожидаемый HTML
<select id="SkillLevels_SkillLevel" name="SkillLevel">
<option value="1">High</option>
<option value="2">Med</option>
<option selected="selected" value="3">Low</option>
</select>
Также попытался
<%= Html.Encode((string)ViewData.ModelMetadata.AdditionalValues["PropertyName"])%>
..., что привело к "SkillLevel" (не "SkillLevels".SkillLevel "), подтверждая, что данные, хранящиеся в метаданных, верны.
и
<%= Html.DropDownList(
(string)ViewData.ModelMetadata.AdditionalValues["PropertyName"], Model,
new { name = (string)ViewData.ModelMetadata.AdditionalValues["PropertyName"] }) %>
... что все равно привело к <select name=SkillLevels.Skilllevel>
.
Вопросы
Что здесь происходит?Почему он добавляет имя вместо того, чтобы просто использовать его?Можете ли вы предложить хороший обходной путь?
Обновление:
В итоге я написал вспомогательное расширение, которое буквально выполняет поиск / замену текста html:
public static MvcHtmlString BindableDropDownListForModel(this HtmlHelper helper)
{
var propertyName = (string)helper.ViewData.ModelMetadata.AdditionalValues["PropertyName"];
var compositeName = helper.ViewData.ModelMetadata.PropertyName + "." + propertyName;
var rawHtml = helper.DropDownList(propertyName, (SelectList)helper.ViewData.Model);
var bindableHtml = rawHtml.ToString().Replace(compositeName, propertyName);
return MvcHtmlString.Create(bindableHtml);
}
>>> Я все еще хотел бы понять, почему этот обходной путь необходим.Почему элементу select
присваивается составное имя, а не точное имя, которое я предоставляю?