MvcScaffold неправильно создает мои связанные выпадающие списки - PullRequest
3 голосов
/ 10 марта 2011

MvcScaffold Версия: 0.9.7

Хорошо, MvcScaffold генерирует этот код для меня в моем _CreateOrEdit.cshtml частичном представлении:

<div class="editor-field">
    @Html.DropDownListFor(model => model.LocationId, ((IEnumerable<JobSite.Models.Location>)ViewBag.PossibleLocations).Select(option => new SelectListItem {
        Text = Html.DisplayTextFor(_ => option).ToString(), 
        Value = option.LocationId.ToString(),
        Selected = (Model != null) && (option.LocationId == Model.LocationId)
    }), "Choose...")
    @Html.ValidationMessageFor(model => model.LocationId)
</div>

Это, однако, генерирует следующий HTML:

<select data-val="true" data-val-number="The field LocationId must be a number." data-val-required="The LocationId field is required." id="LocationId" name="LocationId"><option value="">Choose...</option>
     <option value="1">1</option>
     <option value="2">2</option>
</select>

Как вы увидите, текст "утопления" отображается так же, как и "значение".

Очевидно, что каждый раз я могу повторно коснуться этого кода вручную, выполнив:

Text = Html.DisplayTextFor(_ => option.LocationName).ToString(), 

... но я бы хотел решить эту проблему, чтобы избежать этого.

Может ли кто-нибудь предложить какое-либо руководство?

Спасибо, Пол

1 Ответ

1 голос
/ 02 апреля 2011

Я считаю, что проблема в том, что MvcScaffolding не знает, какое свойство должно представлять ваше текстовое поле. Шаблоны пытаются найти свойство-кандидат в классе, который, по его мнению, может представлять столбец, который будет иметь значение, представляющее свойство "text". Я видел код, и он ищет такие вещи, как «Имя», «Заголовок» и т. Д. Если он найдет один из них, он будет использовать это поле для свойства текста. Вот фактический код, который он использует:

static string[] displayPropertyNames = new[] { "Name", "Title", "LastName", "Surname", "Subject", "Count" };

Он будет использовать первый найденный файл, и если он вообще его не найдет, вы получите код, который у вас есть в данный момент. Это не идеально, потому что у вас может не быть ни одного из этих имен, и / или у вас может быть поле с одним из этих имен, но вы можете не захотеть, чтобы оно представляло текстовое значение в раскрывающемся списке.

Другим вариантом, который должен решить эту проблему, является создание частичного класса и присоединение атрибута DisplayColumn к типу модели, который вы привязываете к раскрывающемуся списку. Например:

[DisplayColumn("LocationName")] public partial class DropDownBoundType {}

Однако я обнаружил, что реализация частичного класса вызывает некоторые другие проблемы, когда генератор MvcScaffolding прекращает распознавать поля как ключи ассоциации. Таким образом, вместо выпадающих списков в некоторых случаях создаются текстовые поля. Не знаю, в чем проблема, и, возможно, это не повлияет на вас, но, к сожалению, я так осторожно поступаю так.

Также я заметил, что вы работаете с 9.7 и доступна новая версия 9.8. Я не думаю, что это решает вашу проблему, но затрагивает некоторые другие. Возможно, стоит потратить время на обновление и обновление.

...