Почему HTML. DropDownList () производящий <выбирают имя = “original_name.name”> вместо просто <избранное имя = “имя”>?

Я сделал, чтобы редактор обработал по шаблону, чье задание состоит в том, чтобы взять 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 элементу присваивают составное имя, а не точное имя, которое я обеспечиваю?

1
задан devuxer 15 March 2010 в 18:04
поделиться

2 ответа

Я боролся с раскрывающимся списком MVC - он просто работает неправильно. Итак, я просто создаю свой собственный html с помощью foreach для данных моей модели. Возможно, это неприемлемый обходной путь для вас, но MVC намеренно гибок.

1
ответ дан 3 September 2019 в 01:12
поделиться

Отказ от ответственности: я не уверен, что это полностью безопасно и ничего не сломает. Но я столкнулся с точно такой же ситуацией. Однако, как только я установил ViewData.TemplateInfo.HtmlFieldPrefix = String.Empty , проблема ушла. Такое поведение, по-видимому, заложено в пользовательских шаблонах - например, взгляните на ViewData.TemplateInfo.GetFullHtmlFieldName .

1
ответ дан 3 September 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: