Почему Html.DropDownList () создаетвместо просто? - PullRequest
1 голос
/ 18 февраля 2010

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

Ответы [ 2 ]

1 голос
/ 13 июля 2010

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

1 голос
/ 19 февраля 2010

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

...