Я сделал, чтобы редактор обработал по шаблону, чье задание состоит в том, чтобы взять a SelectList
как его модель и сборка a select
элемент в HTML с помощью Html.DropDownList()
расширение помощника.
Я пытаюсь присвоиться name
атрибут для select
на основе a 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
элементу присваивают составное имя, а не точное имя, которое я обеспечиваю?
Я боролся с раскрывающимся списком MVC - он просто работает неправильно. Итак, я просто создаю свой собственный html с помощью foreach для данных моей модели. Возможно, это неприемлемый обходной путь для вас, но MVC намеренно гибок.
Отказ от ответственности: я не уверен, что это полностью безопасно и ничего не сломает.
Но я столкнулся с точно такой же ситуацией. Однако, как только я установил
ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty
,
проблема ушла. Такое поведение, по-видимому, заложено в пользовательских шаблонах - например, взгляните на ViewData.TemplateInfo.GetFullHtmlFieldName
.