Nano Hash - криптовалюты, майнинг, программирование

Html.DropDownListFor загружается с неправильным значением в первый раз, но потом каждый раз корректируется?

Я работаю над приложением MVC5 (Oracle DB) и заметил странное поведение с привязанным выпадающим списком в моем представлении. Когда я выбираю запись для редактирования, мое действие контроллера GET-Edit загружает список имен из моего TBL_OWNERS, отсортированных по [OWNER_NAME], в мой объект ViewData:

ViewData["Owner_List"] = new SelectList(db.TBL_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME");

Затем в своем представлении я использую этот список ViewData для заполнения SelectList, который заполняет DropDownListFor:

@Html.DropDownListFor(model => model.OWNER, (SelectList)ViewData["Owner_List"], "NONE", htmlAttributes: new { @class = "form-control dropdown", @id = "selectOwner" })

Теперь, когда я выбираю запись для редактирования, которая не имеет значения для [OWNER], я получаю ожидаемое значение по умолчанию «НЕТ» в качестве выбранного параметра в раскрывающемся списке. Однако, если у меня есть значение для [OWNER] (например) «СМИТ, ДЖОН», при загрузке представления все еще отображается «НЕТ» в раскрывающемся списке.

Что так странно, так это то, что если я затем сохраню запись (указав ЛЮБОЕ имя из раскрывающегося списка), в следующий раз, когда я войду в свое представление редактирования для этой записи, раскрывающийся список уже предварительно выбран для правильного значения, уже сохраненного в Oracle ДБ.

Может ли кто-нибудь с большим опытом взвесить, что здесь происходит и как это исправить?


Для дополнительной информации (если это поможет) мой основной класс DAL имеет поле [OWNER], определенное как:

[StringLength(4000)]
public string OWNER { get; set; }

И затем у меня также есть класс MetaData для этого основного класса:

namespace Project.DAL
{

    // This MetaData partial class is used to extend properties of the [ENT_COLLECTIONS] DAL class
    // allowing for new properties to be set explicitly filled with related FK values.
    [MetadataType(typeof(ENT_COLLECTIONSMD))]
    public partial class ENT_COLLECTIONS
    {

        // .... Other MetaData Fields ...

        [Display(Name = "Owner")]
        public string Owner_Name
        {
            get
            {
                // TBL_OWNERS is not linked to ENT_COLLECTIONS like the other child tables (Locations, Types, etc.)
                // Need to retrieve the [OWNER_NAME] from [ENT_OWNERS] to specify for [ENT_COLLECTIONS].[OWNER] instead of
                // (ex.) "47" for the value.

                // Band-Aid for Exporting where OWNER (ex.) "Smith, John" cannot be converted to a Decimal. If values is < 4 (ID), then proceed.
                if (this.OWNER != null && this.OWNER.Length < 4)
                {
                    // Convert the values of [ENT_COLLECTIONS].[OWNER] to decimal ("47" => 47)
                    var ownerID = Convert.ToDecimal(this.OWNER);
                    // Match this ID to [TBL_OWNERS].[ID] to get the singular referenced [TBL_OWNERS] entity.
                    var ownerEntity = db.TBL_OWNERS.FirstOrDefault(model => model.ID == ownerID);
                    // If a match was found, change [OWNER] from (ex.) "47" to "SMTIH, JOHN"
                    if (ownerEntity != null)
                    {
                        this.OWNER = ownerEntity.OWNER_NAME;
                    }
                }

                return this.OWNER;
            }
        }
    }

    public class ENT_COLLECTIONSMD
    {
        // ... Other Fields ...

        [StringLength(4000)]
        public string OWNER;
    }
}

Ответы:


1
ViewData["Owner_List"] = new SelectList(db.TBL_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME");

вам следует использовать другой конструктор, поскольку вы не указываете выбранный элемент в списке. Помощник MVC DropdownListFor не выбирает значение автоматически и ожидает, что вы сообщите SelectList, какой элемент выбран.

Правильный способ инициализации этого SelectList:

ViewData["Owner_List"] = new SelectList(db.TBL_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", [OWNER_ID]);

Ссылаясь на странное поведение, которое вы видите, когда элемент уже выбран, когда вы возвращаетесь к представлению, вероятно, ваш веб-браузер пытается выполнить автозаполнение выбора. Вы должны сделать тест, указав autocomplete="off" как свойство html.

Вы можете найти аналогичный вопрос здесь: Как сделать элемент списка выбора выбранным в asp.net mvc?

PS: В качестве примечания, постарайтесь не использовать ViewData, если вы не вынуждены это делать. Использование модели и строго типизированного представления почти всегда лучше.

11.06.2015
  • Когда я пытаюсь сделать следующее, раздел после "ID", "OWNER_NAME" помечается как Cannot convert lambda expression to type 'object' becuase it is not a delegate type? ENT_COLLECTIONS ent_Collections = await db.ENT_COLLECTIONS.FindAsync(id); ViewData["Owner_List"] = new SelectList(db.TBL_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", x => x.OWNER_NAME == ent_Collections.OWNER); Visual Studio помечает предложенное вами добавление как ошибку. 11.06.2015
  • Да, вы правы, я исправил код. Не знаю почему, но мне действительно показалось, что я где-то видел подпись Func 11.06.2015
  • Я надеялся, что это может помочь, но я все еще получаю то же самое поведение, что и раньше: NONE отображается для действительного значения OWNER, присутствующего в первый раз, а затем исправляется каждый раз после того, как выполняется начальное сохранение. ViewData["Owner_List"] = new SelectList(db.INV_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", ent_Collections.OWNER); 11.06.2015
  • Я должен был быть более ясным, вы должны использовать значение I'd для соответствия параметру ID, который вы указали во втором месте конструктора. Кроме того, попробуйте добавить autocomplete=off в свои свойства HTML, чтобы увидеть, прекращается ли странное поведение. Я снова исправляю код для ясности 11.06.2015
  • Он все еще делает то же самое. Я добавил <input autocomplete="off"> в свое представление, и теперь я передаю [OwnerID] вместо [Owner_Name] для того нового параметра, который вы показали: decimal ownerID = db.INV_OWNERS.FirstOrDefault(x => x.OWNER_NAME == ent_Collections.OWNER).ID; -- ViewData["Owner_List"] = new SelectList(db.INV_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", ownerID); Все то же поведение, что и раньше. 11.06.2015
  • Я думал, что у меня это получилось после просмотра другого поста, на который вы ссылались в своем ответе, но все равно не повезло со следующим: int ownerID = 0; if (ent_Collections.OWNER != null) { ownerID = Convert.ToInt32(db.INV_OWNERS.FirstOrDefault(x => x.OWNER_NAME == ent_Collections.OWNER).ID); } -- ViewData["Owner_List"] = new SelectList(db.INV_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", id = ownerID); Точно такое же поведение, как и раньше. 11.06.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..